Saya telah bermain-main dengan JSON untuk beberapa waktu, hanya mendorongnya keluar sebagai teks dan tidak menyakiti siapa pun (yang saya tahu), tetapi saya ingin mulai melakukan hal-hal dengan benar.
Saya telah melihat so banyak mengaku "standar" untuk tipe konten JSON:
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
Tapi mana yang benar, atau yang terbaik? Saya mengetahui bahwa ada masalah keamanan dan dukungan browser yang bervariasi di antara mereka.
Saya tahu ada pertanyaan serupa,Apa tipe MIME jika JSON dikembalikan oleh _ REST API?, tapi saya ingin jawaban yang sedikit lebih bertarget.
IANA telah mendaftarkan Tipe MIME resmi untuk JSON sebagaiapplication/json
.
Ketika ditanya tentang mengapa bukan text/json
, Crockford tampaknya mengatakan JSON bukan JavaScript atau teks dan juga IANA lebih cenderung membagikan application/*
daripada text/*
.
Sumber lainnya:
Tentu saja, jenis media MIME yang benar untuk JSON adalah application/json
, tetapi perlu untuk menyadari jenis data apa yang diharapkan dalam aplikasi Anda.
Misalnya, saya menggunakan Ext GWT dan respons server harus berupa text/html tetapi berisi data JSON.
Sisi Klien, pendengar formulir Ext GWT
uploadForm.getForm().addListener(new FormListenerAdapter()
{
@Override
public void onActionFailed(Form form, int httpStatus, String responseText)
{
MessageBox.alert("Error");
}
@Override
public void onActionComplete(Form form, int httpStatus, String responseText)
{
MessageBox.alert("Success");
}
});
Jika menggunakan tipe application/json response, browser menyarankan saya untuk menyimpan file.
Cuplikan kode sumber sisi server menggunakan Spring MVC
return new AbstractUrlBasedView()
{
@SuppressWarnings("unchecked")
@Override
protected void renderMergedOutputModel(Map model, HttpServletRequest request,
HttpServletResponse response) throws Exception
{
response.setContentType("text/html");
response.getWriter().write(json);
}
};
Respons adalah data yang dihasilkan secara dinamis, sesuai dengan parameter kueri yang diberikan di URL.
Contoh:
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
Tipe-Konten: application/json
JSON dengan bantalan. Respons adalah data JSON, dengan panggilan fungsi yang melingkupinya.
Contoh:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
Tipe-Konten: application/javascript
Jika Anda menggunakan Ubuntu atau Debian dan Anda menyajikan file .json melalui Apache, Anda mungkin ingin menyajikan file dengan tipe konten yang benar. Saya melakukan ini terutama karena saya ingin menggunakan ekstensi Firefox JSONView
Modul Apache mod_mime akan membantu melakukan ini dengan mudah. Namun, dengan Ubuntu Anda perlu mengedit file /etc/mime.types dan tambahkan baris
application/json json
Kemudian restart Apache:
Sudo service Apache2 restart
Jenis konten yang tepat untuk JSON adalah application/json
KECUALI Anda menggunakan JSONP , juga dikenal sebagai JSON dengan Padding, yang sebenarnya JavaScript dan jenis konten yang tepat adalah application/javascript
.
Tidak ada keraguan bahwa application/json
adalah tipe terbaik MIME untuk respons JSON.
Tapi saya punya pengalaman di mana saya harus menggunakan application/x-javascript
karena beberapa masalah kompresi. Lingkungan hosting saya adalah shared hosting dengan GoDaddy . Mereka tidak mengizinkan saya untuk mengubah konfigurasi server. Saya telah menambahkan kode berikut ke file web.config
saya untuk mengompres respons.
<httpCompression>
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll"/>
<dynamicTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="message/*" enabled="true"/>
<add mimeType="application/javascript" enabled="true"/>
<add mimeType="*/*" enabled="false"/>
</dynamicTypes>
<staticTypes>
<add mimeType="text/*" enabled="true"/>
<add mimeType="message/*" enabled="true"/>
<add mimeType="application/javascript" enabled="true"/>
<add mimeType="*/*" enabled="false"/>
</staticTypes>
</httpCompression>
<urlCompression doStaticCompression="true" doDynamicCompression="true"/>
Dengan menggunakan ini, halaman .aspx dikompres dengan g-Zip tetapi respons JSON tidak. saya tambahkan
<add mimeType="application/json" enabled="true"/>
di bagian tipe statis dan dinamis. Tapi ini tidak mengompres respons JSON sama sekali.
Setelah itu saya menghapus jenis yang baru ditambahkan ini dan menambahkan
<add mimeType="application/x-javascript" enabled="true"/>
di bagian tipe statis dan dinamis, dan mengubah tipe respons di
.ashx (penangan asinkron) ke
application/x-javascript
Dan sekarang saya menemukan bahwa respons JSON saya dikompres dengan g-Zip. Jadi saya pribadi merekomendasikan untuk menggunakan
application/x-javascript
hanya jika Anda ingin mengompres respons JSON Anda pada lingkungan hosting bersama. Karena dalam shared hosting, mereka tidak memungkinkan Anda untuk mengubah IIS konfigurasi.
Hanya ketika menggunakan application/json
sebagai MIME tipe saya memiliki yang berikut (per November 2011 dengan versi Chrome terbaru, Firefox dengan Firebug ):
Tidak semuanya berfungsi untuk tipe konten application/json
.
Jika Anda menggunakan Ext JS form kirim untuk mengunggah file, ketahuilah bahwa respons server diuraikan oleh browser untuk membuat dokumen untuk <iframe>
.
Jika server menggunakan JSON untuk mengirim objek kembali, maka header Content-Type
harus diatur ke text/html
untuk memberitahu browser untuk memasukkan teks tidak berubah ke dalam badan dokumen.
Lihat dokumentasi Ext JS 3.4.0 API .
JSON adalah bahasa khusus domain (DSL) dan format data yang tidak bergantung pada JavaScript, dan karenanya memiliki MIME type, application/json
. Rasa hormat terhadap tipe MIME tentu saja didorong oleh klien, jadi text/plain
dapat melakukan transfer byte, tetapi kemudian Anda akan mendorong interpretasi ke domain aplikasi vendor secara tidak perlu - application/json
. Apakah Anda mentransfer XML melalui text/plain
?
Tapi jujur, pilihan tipe MIME Anda adalah saran kepada klien tentang bagaimana menafsirkan data- text/plain
atau text/HTML
(bila bukan HTML) seperti jenis penghapusan-sama tidak informatifnya dengan membuat semua objek Anda mengetikkan Objek dalam bahasa yang diketikkan .
Tidak ada runtime browser yang saya tahu akan mengambil dokumen JSON dan secara otomatis membuatnya tersedia untuk runtime sebagai objek yang dapat diakses JavaScript tanpa intervensi, tetapi jika Anda bekerja dengan klien yang lumpuh, itu masalah yang sama sekali berbeda. Tapi itu bukan keseluruhan cerita- TENANG layanan JSON sering tidak memiliki runtime JavaScript, tapi itu tidak menghentikan mereka menggunakan JSON sebagai format pertukaran data yang layak. Jika klien lumpuh ... maka saya mungkin akan mempertimbangkan injeksi HTML melalui layanan Ajax templating.
Aplikasi/JSON!
Jika Anda berada di lingkungan sisi klien, menyelidiki tentang dukungan lintas-browser wajib untuk aplikasi web yang didukung dengan baik.
Tipe Konten HTTP yang benar adalah application/json
, karena yang lain sudah disorot juga, tetapi beberapa klien tidak menanganinya dengan baik, itu sebabnya jQuery merekomendasikan text/html
default.
Jawaban yang benar adalah:
Content-Type: application/json
Seperti yang banyak orang lain sebutkan, application/json
adalah jawaban yang benar.
Tetapi apa yang belum dijelaskan adalah apa arti opsi lain yang Anda usulkan.
application/x-javascript
: Jenis MIME eksperimental untuk JavaScript sebelum application/javascript
dibuat standar.
text/javascript
: Sekarang sudah usang. Anda harus menggunakan application/javascript
saat menggunakan javascript.
text/x-javascript
: Jenis MIME eksperimental untuk situasi di atas.
text/x-json
: Jenis MIME eksperimental untuk JSON sebelum application/json
didaftarkan secara resmi.
Semua dalam semua, setiap kali Anda ragu tentang jenis konten, Anda harus memeriksa tautan ini
"application/json
" adalah jenis konten JSON yang benar.
def ajaxFindSystems = {
def result = Systems.list()
render(contentType:'application/json') {
results {
result.each{sys->
system(id:sys.id, name:sys.name)
}
}
resultset (rows:result.size())
}
}
Pendaftaran IANA untuk application/json
mengatakan
Aplikasi yang menggunakan tipe media ini: JSON telah digunakan untuk bertukar data antara aplikasi yang ditulis dalam semua bahasa pemrograman ini: ActionScript, C, C #, Clojure, ColdFusion, Common LISP, E, Erlang, Go, Java, JavaScript, Lua, Objective CAML, Perl, PHP, Python, Rebol, Ruby, Scala, dan Skema.
Anda akan melihat bahwa IANA.org tidak mencantumkan jenis media lain mana pun , bahkan application/javascript
sekarang sudah usang. Jadi application/json
adalah satu-satunya yang mungkin benar jawab.
Dukungan browser adalah hal lain.
Jenis media non-standar yang paling banyak didukung adalah text/json
atau text/javascript
. Tetapi beberapa nama besar bahkan menggunakan text/plain
.
Yang lebih aneh adalah header Tipe-Konten yang dikirim oleh Flickr, yang mengembalikan JSON sebagai text/xml
. Google menggunakan text/javascript
untuk beberapa di antaranya ajax apis.
Contoh:
curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"
Output: Content-Type: text/javascript
curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"
Output: Content-Type: text/xml
Jenis MIME yang tepat adalahapplication/json
TETAPI
Saya mengalami banyak situasi di mana jenis browser atau kerangka kerja yang dibutuhkan pengguna:
text/html
application/javascript
Saya menggunakan di bawah ini
contentType: 'application/json',
data: JSON.stringify(SendData),
Header Content-Type harus diatur ke ' application/json ' saat memposting. Server yang mendengarkan permintaan harus menyertakan " Terima = aplikasi/json ". Di Spring MVC Anda dapat melakukannya seperti ini:
@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")
Tambahkan tajuk ke respons:
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
Di Spring Anda memiliki tipe yang ditentukan: MediaType.APPLICATION_JSON_VALUE
yang setara dengan application/json .
application/json
berfungsi dengan baik di PHP untuk menyimpan data array atau objek.
Saya menggunakan kode ini untuk meletakkan data di JSON di Google Cloud Storage (GCS) yang diatur dapat dilihat secara publik :
$context = stream_context_create([
'gs' => [
'acl'=>'public-read',
'Content-Type' => 'application/json',
]
]);
file_put_contents(
"gs://BUCKETNAME/FILENAME.json",
json_encode((object) $array),
false,
$context
);
Untuk mendapatkan kembali data secara langsung:
$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
Untuk JSON, saya menggunakan:
Content-Type: application/json
Ini dijelaskan dalam proposal Format Pertukaran Data JSON IETF 7158, Bagian 1.2: Spesifikasi JSON .
Jika JSON dengan padding maka itu akan menjadi application/jsonp
. Jika JSON tanpa bantalan maka itu akan menjadi application/json
.
Untuk menangani keduanya, ini adalah praktik yang baik untuk menggunakan: 'application/javascript' tanpa mengganggu apakah itu dengan padding atau tanpa padding.
Memperluas respons yang diterima, ketika Anda menggunakan JSON dalam konteks REST ...
Ada argumen kuat tentang penggunaan application/x-resource+json
dan application/x-collection+json
ketika Anda mewakili sumber daya dan koleksi REST.
Dan jika Anda memutuskan untuk mengikuti jsonapi spesifikasi, Anda harus menggunakan application/vnd.api+json
, seperti yang didokumentasikan.
Meskipun tidak ada standar universal, jelas bahwa semantik yang ditambahkan ke sumber daya yang ditransfer membenarkan yang lebih eksplisit Content-Type daripada hanya application/json
.
Mengikuti alasan ini, konteks lain dapat membenarkan yang lebih spesifik Tipe Konten.
Pengembang PHP menggunakan ini:
<?php
header("Content-type: application/json");
// Do something here...
?>
Jika Anda mendapatkan data dari REST API di JSON maka Anda harus menggunakan tipe konten
For JSON data: Content-Type:application/json
For HTML data: Content-Type:text/html,
For XHTML data: Content-Type:application/xhtml+xml,
For XML data: Content-Type:text/xml, application/xml
JSON (Notasi Objek JavaScript) dan JSONP ("JSON with padding") format tampaknya sangat mirip dan karenanya mungkin sangat membingungkan jenis MIME mana yang harus mereka gunakan. Meskipun formatnya mirip, ada beberapa perbedaan kecil di antara mereka.
Jadi, kapan pun dalam keraguan, saya memiliki pendekatan yang sangat sederhana (yang berfungsi dengan sangat baik dalam kebanyakan kasus), yaitu, pergi dan periksa dokumen RFC yang sesuai.
JSONRFC 4627 (Aplikasi/json Jenis Media untuk Notasi Objek JavaScript (JSON)) adalah spesifikasi format JSON. Dikatakan di bagian 6, bahwa jenis media MIME untuk teks JSON adalah
application/json.
JSONPJSONP ("JSON with padding") ditangani dengan cara yang berbeda dari JSON, di browser. JSONP diperlakukan sebagai skrip JavaScript biasa dan oleh karena itu harus menggunakan application/javascript,
jenis MIME resmi saat ini untuk JavaScript. Namun, dalam banyak kasus, tipe text/javascript
MIME akan berfungsi dengan baik juga.
Perhatikan bahwa text/javascript
telah ditandai sebagai usang oleh RFC 4329 (Scripting Media Type) dokumen dan disarankan untuk menggunakan tipe application/javascript
sebagai gantinya. Namun, karena alasan warisan, text/javascript
masih banyak digunakan dan memiliki dukungan lintas-browser (yang tidak selalu merupakan kasus dengan application/javascript
jenis MIME, terutama dengan browser lama).
Content-Type: application/json
- jsonContent-Type: application/javascript
- json-PContent-Type: application/x-javascript
- javascriptContent-Type: text/javascript
- javascript TAPI usang, versi lama IE digunakan untuk digunakan sebagai atribut html.Content-Type: text/x-javascript
- Jenis Media JavaScript TAPI usangContent-Type: text/x-json
- json sebelum aplikasi/json didaftarkan secara resmi.
Untuk menentukan hasil JSON yang menarik, Anda menambahkan "application/json" di header permintaan Anda seperti di bawah ini:
"Terima: aplikasi/json" adalah format respons yang diinginkan.
"Tipe Konten: application/json" menentukan format konten permintaan Anda, tetapi kadang-kadang Anda menentukan application/json
dan application/xml
, tetapi kualitasnya mungkin berbeda. Server mana yang akan mengirim kembali format respons yang berbeda, lihat contohnya:
Accept:application/json;q=0.4,application/xml;q=8
Ini akan mengembalikan XML, karena XML memiliki kualitas yang lebih tinggi.
Standar saat ini yang tepat adalah application/json
. Sementara pengodean default adalah UTF-8, perlu disebutkan bahwa itu bisa juga UTF-16 atau utf-32. Ketika JSON ditulis dalam UTF-16 atau UTF-32, pengkodean transfer data biner harus digunakan.
Ada informasi lebih lanjut tentang json di sini: https://tools.ietf.org/html/rfc4627
informasi lebih lanjut tentang encoding transfer biner di sini: https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html
Untuk melengkapi sisa jawaban, tipe MIME untuk data tertaut JSON (JSON-LD) menurut W3C adalah:
application/ld+json
Ketikkan nama: aplikasi
Nama subtipe: ld + json
Selain itu, dari sumber yang sama:
Ekstensi file :
.jsonld
Selalu coba untuk mengingat ketiga tipe konten ini walaupun ada banyak tipe konten . karena Anda mungkin harus menggunakan ini lebih sering.