$ .ajax - tipe data

135

Apa perbedaan antara

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

vs.

contentType: "application/json",
dataType: "text",
Nick Kahn
sumber

Jawaban:

181
  • contentTypeadalah header HTTP yang dikirim ke server, menentukan format tertentu.
    Contoh: Saya mengirim JSON atau XML
  • dataTypeapakah Anda memberi tahu jQuery respons seperti apa yang diharapkan.
    Mengharapkan JSON, atau XML, atau HTML, dll. Defaultnya adalah untuk jQuery untuk mencoba dan mencari tahu.

The $.ajax()dokumentasi memiliki deskripsi penuh ini juga.


Dalam kasus tertentu, yang pertama adalah meminta respon untuk berada di UTF-8, kedua tidak peduli. Juga yang pertama memperlakukan respons sebagai objek JavaScript, yang kedua akan memperlakukannya sebagai string.

Jadi yang pertama adalah:

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

Kedua:

success: function(data) {
  alert("Here's lots of data, just a string: " + data);
}
Nick Craver
sumber
1
mana yang lebih disukai atau paling direkomendasikan.
Nick Kahn
1
@Adu - Tidak ada jawaban langsung untuk itu, tergantung apa yang ingin Anda lakukan dengan hasilnya ... mereka melakukan 2 hal yang berbeda. Idealnya, kecuali itu adalah hasil yang sangat sederhana, Anda mungkin ingin berurusan dengan JSON dalam hal yang pertama akan lebih mudah.
Nick Craver
2
Musa benar, contentType menunjukkan format apa yang kami kirim ke server (yaitu post body), bukan apa yang diminta kembali.
antinome
@antinome 2 yang biasanya sangat bergabung, itu penting di sini di Stack Overflow di banyak tempat contoh. Sebenarnya mereka independen, saya telah memperbarui untuk mencerminkan itu.
Nick Craver
Masih belum ada tempat saya dapat menemukan apa yang default, maksud saya akan manual, dan membangun kembali objek setelah setiap panggilan, tetapi dalam mengatur ulang, saya mengalami masalah. jika saya mengaturnya ke 'json' sebagai default, tidak akan melengkapi dugaan cerdas, tetapi berfungsi sampai batas tertentu, sampai sampai ke panggilan di mana saya belum ditentukan (yang BUKAN panggilan JSON itu sendiri), kemudian jika saya mengaturnya ke string kosong, atau null, tampaknya memecah segalanya. dapatkah saya menetapkan sesuatu seperti 'default' atau f'in 'Intellgent Guess' demi f? APA default teknisnya, yaitu seperti mendefinisikan antara dua kutipan dataType = ""?
blamb
51

(ps: jawaban yang diberikan oleh Nick Craver salah)

contentType menentukan format data yang dikirim ke server sebagai bagian dari permintaan (juga dapat dikirim sebagai bagian dari respons, lebih lanjut tentang itu nanti).

dataType menentukan format data yang diharapkan untuk diterima oleh klien (browser).

Keduanya tidak bisa dipertukarkan.

  • contentTypeadalah header yang dikirim ke server, menentukan format data (yaitu isi dari badan pesan) yang sedang ke server. Ini digunakan dengan permintaan POST dan PUT. Biasanya ketika Anda mengirim permintaan POST, badan pesan terdiri dari parameter yang diteruskan seperti:

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

Permintaan sampel:

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

name=sam&age=35

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

Baris terakhir di atas "name = sam & age = 35" adalah isi pesan dan contentType menentukannya sebagai aplikasi / x-www-form-urlencoded karena kita meneruskan parameter formulir di badan pesan. Namun kami tidak terbatas hanya mengirim parameter, kami dapat mengirim json, xml, ... seperti ini (mengirim berbagai jenis data sangat berguna dengan layanan web RESTful):

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

Permintaan sampel:

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

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

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

Jadi ContentType kali ini adalah: application / xml, karena itulah yang kami kirim. Contoh di atas menunjukkan permintaan sampel, seperti halnya respons yang dikirim dari server juga dapat memiliki header Tipe Konten yang menentukan apa yang dikirim oleh server seperti ini:

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

tanggapan sampel:

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>

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

  • dataTypemenentukan format respons yang diharapkan. Ini terkait dengan header Terima. JQuery akan mencoba menyimpulkannya berdasarkan Content-Type dari respons.

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

Permintaan sampel:

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

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

Permintaan di atas mengharapkan XML dari server.

Mengenai pertanyaan Anda,

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

Di sini Anda mengirim data json menggunakan set karakter UTF8, dan Anda mengharapkan data json kembali dari server. Sesuai dokumen JQuery untuk tipe data,

Jenis json mem-parsing file data yang diambil sebagai objek JavaScript dan mengembalikan objek yang dibuat sebagai data hasil.

Jadi yang Anda dapatkan dalam handler sukses adalah objek javascript yang tepat (JQuery mengonversi objek json untuk Anda)

sedangkan

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

Di sini Anda mengirim data json, karena Anda belum menyebutkan penyandiannya, sesuai dengan dokumen JQuery,

Jika tidak ada charset yang ditentukan, data akan dikirim ke server menggunakan charset default server; Anda harus memecahkan kode ini dengan tepat di sisi server.

dan karena tipe data ditentukan sebagai teks, yang Anda dapatkan dalam penangan sukses adalah teks biasa, sesuai dokumen untuk tipe data,

Teks dan tipe xml mengembalikan data tanpa pemrosesan. Data hanya diteruskan ke penangan sukses

era nash
sumber
7

sesuai dokumen :

  • "json": Mengevaluasi respons sebagai JSON dan mengembalikan objek JavaScript. Di jQuery 1.4 data JSON diuraikan secara ketat; JSON yang salah format ditolak dan kesalahan parse dilemparkan. (Lihat json.org untuk informasi lebih lanjut tentang pemformatan JSON yang tepat.)
  • "text": String teks biasa.
SilentGhost
sumber
2

jQuery Ajax loader tidak berfungsi dengan baik ketika Anda memanggil dua API secara bersamaan. Untuk mengatasi masalah ini, Anda harus memanggil API satu per satu menggunakan isAsyncproperti di pengaturan Ajax. Anda juga perlu memastikan bahwa tidak ada kesalahan dalam pengaturan. Jika tidak, loader tidak akan berfungsi. Misalnya tipe konten yang tidak ditentukan, tipe data untuk panggilan POST / PUT / DELETE / GET.

Atif Hussain
sumber
Jika Anda memberikan deskripsi yang lebih baik, ini adalah jawaban yang bagus ... harap cantumkan informasi lebih lanjut di pos ini.
wahwahwah