$ .ajax - kiểu dữ liệu


135

Sự khác biệt giữa

contentType: "application/json; charset=utf-8",
dataType: "json",

so với

contentType: "application/json",
dataType: "text",

Câu trả lời:


181
  • contentTypetiêu đề HTTP được gửi đến máy chủ, chỉ định một định dạng cụ thể.
    Ví dụ: Tôi đang gửi JSON hoặc XML
  • dataTypebạn đang nói với jQuery loại phản ứng mong đợi.
    Yêu cầu JSON, hoặc XML hoặc HTML, v.v. Mặc định là để jQuery thử và tìm ra nó.

Các $.ajax()tài liệu có mô tả đầy đủ về những điều này là tốt.


Trong trường hợp cụ thể của bạn, là người đầu tiên là yêu cầu cho các phản ứng được trong UTF-8, thứ hai không quan tâm. Ngoài ra, thứ nhất là coi phản hồi là một đối tượng JavaScript, thứ hai sẽ coi nó như một chuỗi.

Vì vậy, đầu tiên sẽ là:

success: function(data) {
  // get data, e.g. data.title;
}

Thư hai:

success: function(data) {
  alert("Here's lots of data, just a string: " + data);
}

1
cái nào là cách ưa thích hơn hoặc được khuyên dùng nhất.
Nick Kahn

1
@Adu - Không có câu trả lời trực tiếp cho điều đó, phụ thuộc vào những gì bạn muốn làm với kết quả ... họ đang làm 2 việc khác nhau. Lý tưởng nhất, trừ khi đó là một kết quả rất đơn giản, có lẽ bạn muốn xử lý JSON trong trường hợp đầu tiên sẽ dễ dàng hơn.
Nick Craver

2
Musa đã đúng, contentType cho biết định dạng nào chúng tôi gửi đến máy chủ (tức là nội dung bài đăng), chứ không phải những gì được yêu cầu quay lại.
antinome

@antinome 2 người đó thường rất tham gia, vấn đề ở đây là về Stack Overflow ở nhiều nơi. Nói đúng ra họ độc lập, tôi đã cập nhật để phản ánh điều đó.
Nick Craver

Vẫn không có nơi nào tôi có thể tìm thấy mặc định là gì, ý tôi là tôi đang làm thủ công và xây dựng lại đối tượng sau mỗi cuộc gọi, nhưng khi đặt lại, tôi gặp vấn đề. nếu tôi đặt nó thành 'json' làm mặc định, thì sẽ không bổ sung cho dự đoán thông minh, nhưng nó sẽ hoạt động ở một mức độ nhất định, cho đến khi nó nhận được cuộc gọi mà tôi chưa chỉ định (đó không phải là cuộc gọi JSON), sau đó nếu tôi đặt nó thành chuỗi rỗng, hoặc null, nó dường như phá vỡ mọi thứ. Tôi có thể đặt thành một cái gì đó như 'mặc định' hoặc f'in 'Intellgent Guess' vì lợi ích của f không? Mặc định kỹ thuật là gì, nghĩa là như định nghĩa giữa hai dấu ngoặc kép dataType = ""?
blamb

51

(ps: câu trả lời được đưa ra bởi Nick Craver là không chính xác)

contentType chỉ định định dạng của dữ liệu được gửi đến máy chủ như một phần của yêu cầu (nó cũng có thể được gửi như một phần của phản hồi, nhiều hơn về điều đó sau).

dataType chỉ định định dạng dữ liệu dự kiến ​​sẽ được nhận bởi máy khách (trình duyệt).

Cả hai đều không thể thay thế cho nhau.

  • contentTypelà tiêu đề được gửi đến máy chủ, chỉ định định dạng của dữ liệu (tức là nội dung của nội dung thư) đang được gửi đến máy chủ. Điều này được sử dụng với các yêu cầu POST và PUT. Thông thường khi bạn gửi yêu cầu POST, phần thân thông báo bao gồm các tham số được truyền như:

==============================

Yêu cầu mẫu:

POST /search HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
<<other header>>

name=sam&age=35

==============================

Dòng cuối cùng phía trên "name = sam & age = 35" là phần thân thông báo và contentType chỉ định nó là application / x-www-form-urlencoding do chúng ta truyền các tham số biểu mẫu trong phần thân thông báo. Tuy nhiên, chúng tôi không giới hạn chỉ gửi các tham số, chúng tôi có thể gửi json, xml, ... như thế này (gửi các loại dữ liệu khác nhau đặc biệt hữu ích với các dịch vụ web RESTful):

==============================

Yêu cầu mẫu:

POST /orders HTTP/1.1
Content-Type: application/xml
<<other header>>

<order>
   <total>$199.02</total>
   <date>December 22, 2008 06:56</date>
...
</order>

==============================

Vì vậy, ContentType lần này là: application / xml, vì đó là những gì chúng tôi đang gửi. Các ví dụ trên cho thấy yêu cầu mẫu, tương tự như phản hồi gửi từ máy chủ cũng có thể có tiêu đề Kiểu nội dung chỉ định những gì máy chủ đang gửi như thế này:

==============================

mẫu phản ứng:

HTTP/1.1 201 Created
Content-Type: application/xml
<<other headers>>

<order id="233">
   <link rel="self" href="http://example.com/orders/133"/>
   <total>$199.02</total>
   <date>December 22, 2008 06:56</date>
...
</order>

==============================

  • dataTypechỉ định định dạng của phản ứng mong đợi. Nó liên quan đến tiêu đề Chấp nhận. JQuery sẽ cố gắng suy luận nó dựa trên Kiểu nội dung của phản hồi.

==============================

Yêu cầu mẫu:

GET /someFolder/index.html HTTP/1.1
Host: mysite.org
Accept: application/xml
<<other headers>>

==============================

Yêu cầu trên là mong đợi XML từ máy chủ.

Liên quan đến câu hỏi của bạn,

contentType: "application/json; charset=utf-8",
dataType: "json",

Tại đây bạn đang gửi dữ liệu json bằng bộ ký tự UTF8 và bạn mong đợi dữ liệu json từ máy chủ. Theo tài liệu JQuery cho dataType,

Kiểu json phân tích tệp dữ liệu được tìm nạp dưới dạng đối tượng JavaScript và trả về đối tượng được xây dựng làm dữ liệu kết quả.

Vì vậy, những gì bạn nhận được trong trình xử lý thành công là đối tượng javascript thích hợp (JQuery chuyển đổi đối tượng json cho bạn)

trong khi

contentType: "application/json",
dataType: "text",

Ở đây bạn đang gửi dữ liệu json, vì bạn đã không đề cập đến mã hóa, theo các tài liệu JQuery,

Nếu không có bộ ký tự được chỉ định, dữ liệu sẽ được truyền đến máy chủ bằng bộ ký tự mặc định của máy chủ; bạn phải giải mã điều này một cách thích hợp ở phía máy chủ.

và vì dataType được chỉ định là văn bản, những gì bạn nhận được trong trình xử lý thành công là văn bản thuần túy, theo các tài liệu cho dataType,

Các loại văn bản và xml trả về dữ liệu mà không cần xử lý. Dữ liệu đơn giản được chuyển cho người xử lý thành công


7

theo tài liệu :

  • "json": Đánh giá phản hồi dưới dạng JSON và trả về một đối tượng JavaScript. Trong jQuery 1.4, dữ liệu JSON được phân tích cú pháp một cách nghiêm ngặt; bất kỳ JSON không đúng định dạng nào đều bị từ chối và lỗi phân tích cú pháp được đưa ra. (Xem json.org để biết thêm thông tin về định dạng JSON thích hợp.)
  • "text": Một chuỗi văn bản đơn giản.

2

Trình tải jQuery Ajax không hoạt động tốt khi bạn gọi hai API cùng một lúc. Để giải quyết vấn đề này, bạn phải gọi từng API một bằng cách sử dụng thuộc isAsynctính trong cài đặt Ajax. Bạn cũng cần đảm bảo rằng không nên có bất kỳ lỗi nào trong cài đặt. Nếu không, trình tải sẽ không hoạt động. Ví dụ: loại nội dung không xác định, loại dữ liệu cho cuộc gọi POST / PUT / DELETE / GET.


Nếu bạn cung cấp mô tả tốt hơn, đây là một câu trả lời tốt ... vui lòng đặt thêm thông tin trong bài viết này.
wahwahwah
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.