2015-10-11 15 views
7

Tôi đang cố gắng hiểu sự khác biệt giữa chấp nhận và kiểu dữ liệu trong một yêu cầu Ajax. tiểu bang tài liệu:dataType vs accept - Ajax Request

Documentation

chấp nhận (mặc định: phụ thuộc vào DataType) Loại: PlainObject Kiểu nội dung được gửi trong tiêu đề yêu cầu mà nói với máy chủ loại phản ứng nó sẽ chấp nhận để đổi lại.

Loại dữ liệu (mặc định: Đoán thông minh (xml, json, tập lệnh hoặc html)) Loại: Chuỗi Loại dữ liệu bạn đang đợi từ máy chủ.

Về cơ bản, có giống nhau không ?, nó có cùng mục đích.

+2

"Bạn gửi" và "Bạn đang mong đợi" – SerCrAsH

+0

Để gửi là contentType, câu hỏi của tôi là về dataType và chấp nhận cả hai đều rõ ràng cho những gì tôi mong đợi từ máy chủ. –

+0

Dường như 'accept' là cách bạn phải nói với máy chủ loại câu trả lời nào bạn muốn, trong trường hợp nó có nhiều tùy chọn để cung cấp, trong khi' dataType' là những gì bạn đang mong đợi như một phản hồi để đáp ứng là corectly phân tích cú pháp. –

Trả lời

8

Đây là một, hy vọng, câu trả lời chính xác:

Tùy chọn accepts phép bạn thay đổi Accept tiêu đề trong yêu cầu

Khi bạn thay đổi tùy chọn này, Accept tiêu đề trong yêu cầu sẽ được thiết lập cho (các) người được chỉ định. Lưu ý rằng nó không phải là một chuỗi, nhưng một đối tượng ánh xạ kiểu MIME của các câu trả lời được chấp nhận. Giống như { text: "text/plain", html: "text/html" }. Tiêu đề Accept có thể được máy chủ sử dụng để cung cấp phản hồi ở định dạng được mong đợi theo yêu cầu hoặc không thành công trong trường hợp không thể cung cấp phản hồi theo một trong các định dạng được mong đợi theo yêu cầu. Một điều thực sự quan trọng là, ít nhất trong jQuery 1.11.3 (nơi tôi đã thử nghiệm), tùy chọn này dường như không hoạt động, thay vào đó tôi đã thay đổi tiêu đề bằng cách sử dụng tùy chọn headers: headers: {Accept : "text/json"}.

Các tùy chọn cho phép bạn dataType trước quá trình phản ứng

Nếu bạn định nghĩa một dataType, phản ứng của các yêu cầu sẽ được pre-xử lý bởi jQuery trước khi sẵn sàng xử lý succes. Ví dụ:

Nếu json được chỉ định, đáp ứng được phân tách bằng jQuery.parseJSON trước khi được thông qua, như là một đối tượng, để xử lý thành công.

Nếu script được chỉ định, $.ajax() sẽ thực thi JavaScript nhận được từ máy chủ trước khi chuyển cho trình xử lý thành công dưới dạng chuỗi.

Ví dụ khác here, trong phần "Loại dữ liệu".

Trong trường hợp dataType không được đặt, số Content-Type của phản hồi sẽ xác định việc xử lý trước sẽ được thực hiện cho phản hồi. Lưu ý rằng việc thay đổi dataType cũng sẽ thay đổi tiêu đề Accept. Thông thường, bạn không cần phải tự thay đổi tiêu đề Accept.

Ví dụ

yêu cầu.php

<?php 
if(strpos($_SERVER["HTTP_ACCEPT"],"text/javascript") === false) 
    exit("I only provide text/javascript responses"); 

echo "alert('This is my response!')"; 

index.html

<button id="send">Send</button> 
<div id="response"></div> 

<script src="https://code.jquery.com/jquery-1.11.3.min.js"></script> 
<script> 
$(function(){ 

    $("#send").click(function(){ 
     $.ajax({ 
      method: "GET", 
      url: "request.php", 
      dataType: "script" // Change this to "text" and you will see the difference 
     }).done(function(data) { 
      $("#response").text(data); 
     }); 
    }); 


}); 
</script> 

Khi dataType được thiết lập để "script" các Accept tiêu đề sẽ bao gồm "text/javascript" nên thử nghiệm trên request.php sẽ vượt qua. Nó sẽ trả về "alert('This is my response!')" và vì dataType được đặt thành "script" jQuery sẽ cố gắng thực hiện điều đó dưới dạng javascript và sau đó chuyển nó dưới dạng văn bản thuần túy đến trình xử lý thành công.

Nếu bạn thay đổi dataType-"text" các Accept tiêu đề sẽ KHÔNG bao gồm "text/javascript" nên thử nghiệm trên request.php sẽ thất bại. Nó sẽ trả về "I only provide text/javascript responses" và vì dataType được đặt thành "text" jQuery sẽ chuyển nó dưới dạng văn bản thuần túy cho trình xử lý thành công.

+0

Cảm ơn Alvaro, đó là một lời giải thích tốt. –

+2

Tôi đã gặp vấn đề với chấp nhận tiêu đề cũng trên 1.11.2, bằng cách sử dụng 'tiêu đề: {Accept:" application/json "}' làm cho nó hoạt động. Đối với một số lý do nó đã được gửi 'Chấp nhận: */*' mặc dù contentType và dateType vv đã được tất cả các thiết lập cho json. –