Ketika saya membuat permintaan POST dengan tubuh JSON ke layanan REST saya, saya sertakan Content-type: application/json; charset=utf-8
di header pesan. Tanpa tajuk ini, saya mendapatkan kesalahan dari layanan. Saya juga bisa berhasil menggunakan Content-type: application/json
tanpa ;charset=utf-8
porsi.
Apa yang sebenarnya charset=utf-8
dilakukan? Saya tahu itu menentukan pengkodean karakter tetapi layanan berfungsi dengan baik tanpa itu. Apakah penyandian ini membatasi karakter yang bisa berada di badan pesan?
character-encoding
mime-types
DenaliHardtail
sumber
sumber
application/json
, tampaknya tidak adacharset
parameter yang didukung sama sekali, meskipun sering diberikan dalam praktik.I know it specifies the character encoding but the service works fine without it.
"berfungsi" tidak selalu berarti "kode / konfigurasi yang ada adalah cara paling benar yang mencakup semua kasus sudut untuk melakukan satu hal". Itu tergantung pada semua konvensi dan asumsi yang mungkin tidak berfungsi dalam keadaan lain. Bagi saya pribadi, saya selalu berusaha sejelas mungkin.Jawaban:
Header hanya menunjukkan konten yang dikodekan. Tidak mungkin untuk menyimpulkan jenis konten dari konten itu sendiri, yaitu Anda tidak bisa hanya melihat konten dan tahu apa yang harus dilakukan dengannya. Untuk itulah tajuk HTTP, mereka memberi tahu penerima jenis apa yang mereka hadapi.
Content-type: application/json; charset=utf-8
menetapkan konten dalam format JSON, disandikan dalam pengkodean karakter UTF-8. Menentukan pengkodean agak berlebihan untuk JSON, karena pengkodean default (hanya?) Untuk JSON adalah UTF-8. Jadi dalam hal ini server penerima tampaknya senang mengetahui bahwa ia berurusan dengan JSON dan mengasumsikan bahwa pengkodean adalah UTF-8 secara default, itu sebabnya ia bekerja dengan atau tanpa header.Tidak. Anda dapat mengirim apa pun yang Anda inginkan di tajuk dan isi. Tetapi, jika keduanya tidak cocok, Anda mungkin mendapatkan hasil yang salah. Jika Anda menentukan di header bahwa konten dikodekan UTF-8 tetapi Anda benar-benar mengirim konten terkode Latin1, penerima dapat menghasilkan data sampah, mencoba untuk menafsirkan data terkode Latin1 sebagai UTF-8. Jika tentu saja Anda menentukan bahwa Anda mengirim data yang disandikan Latin1 dan Anda benar-benar melakukannya, maka ya, Anda terbatas pada 256 karakter yang dapat Anda encode dalam Latin1.
sumber
\u20AC
.application/json
harus dalam salah satu format transformasi ucs. Juga, karena empat byte pertama JSON terbatas, Anda selalu dapat mengetahui apakah itu 8, 16, atau 32 dan daya tahannya.charset=utf-8
untuk alasan keamanan: github.com/shieldfy/API-Security-Checklist/issues/25Untuk membuktikan klaim @ deceze bahwa penyandian JSON default adalah UTF-8 ...
Dari IETF RFC4627 :
sumber
"\u0000"
).xx 00 00 00
masih UTF-32LE danxx 00 xx xx
masih UTF-16LE,00 xx xx xx
masih UTF-16BE.Perhatikan bahwa IETF RFC4627 telah digantikan oleh IETF RFC7158 . Di bagian [8.1] itu menarik kembali teks yang dikutip oleh @Drew dengan mengatakan:
sumber
Saya benar-benar setuju dengan @menerima tetapi saya ingin mengembangkan ini "Saya mendapatkan kesalahan dari layanan" pada pertanyaan,
Kami mendapatkan kesalahan seperti ini sebagai http 415
Kode respons klien kesalahan Jenis Media HTTP 415 Tidak Didukung menunjukkan bahwa server menolak untuk menerima permintaan karena format payload dalam format yang tidak didukung.
Masalah format mungkin disebabkan oleh Jenis - Konten atau Pengodean-Konten yang diminta , atau sebagai hasil dari inspeksi data secara langsung.
Dengan kata lain seperti terlihat di https://stackoverflow.com/a/22643964/914284 contoh ini.
sumber
Implementasi Dart http memproses byte berkat "charset = utf-8", jadi saya yakin beberapa implementasi di luar sana mendukung hal ini, untuk menghindari charset fallback "latin-1" saat membaca byte dari respons. Dalam kasus saya, saya benar-benar kehilangan format pada string body respons, jadi saya harus melakukan enkode byte secara manual ke utf8, atau menambahkan parameter header "inner" pada respons API server saya.
sumber
Saya menggunakan HttpClient dan mendapatkan header respons kembali dengan tipe konten
application/json
, saya kehilangan karakter seperti bahasa asing atau simbol yang menggunakan unicode karena HttpClient adalah default untuk ISO-8859-1 . Jadi, sejelas mungkin seperti yang disebutkan oleh @WesternGun untuk menghindari masalah yang mungkin terjadi.Tidak ada cara menangani itu karena server tidak menangani charset (
method.setRequestHeader("accept-charset", "UTF-8");
) header yang diminta ( ) untuk saya dan saya harus mengambil data respons sebagai draw bytes dan mengubahnya menjadi String menggunakan UTF-8. Jadi, disarankan untuk eksplisit dan menghindari asumsi nilai default.sumber