私はしばらくの間 _ json _ をめちゃくちゃにしてきましたが、それをテキストとして押し出すだけで、誰にも害はありませんでした(知っていることですが)。
私は so を見てきましたが、JSONコンテンツタイプの「標準」と言われています。
application/json
application/x-javascript
text/javascript
text/x-javascript
text/x-json
しかし、どれが正しいのか、それとも一番いいのか?私は、セキュリティとブラウザサポートの問題がそれらの間で異なることを集める。
JSONがREST APIによって返されている場合、どのMIMEタイプになりますか。しかし、もう少しターゲットを絞った回答をお願いします。
_ iana _ はJSONの公式MIMEタイプをapplication/json
として登録しました。
なぜtext/json
ではないのかという質問に対して、Crockford氏は、JSONは実際にはJavaScriptでもテキストでもないと言っていたようで、またIANAはapplication/*
よりtext/*
を配布する傾向がありました。
より多くのリソース:
もちろん、JSONの正しいMIMEメディアタイプはapplication/json
ですが、アプリケーションでどのような種類のデータが想定されているかを理解する必要があります。
たとえば、 Ext GWT を使用すると、サーバーの応答は text/html のようになりますが、JSONデータが含まれます。
クライアント側、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");
}
});
application/json レスポンスタイプを使用する場合、ブラウザはファイルを保存するように私に勧めます。
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);
}
};
URLに渡されたクエリパラメータに従って、応答は動的に生成されたデータです。
例:
{ "Name": "Foo", "Id": 1234, "Rank": 7 }
コンテンツタイプ: application/json
パディング付きのJSON。応答はJSONデータであり、それをラップした関数呼び出しがあります。
例:
functionCall({"Name": "Foo", "Id": 1234, "Rank": 7});
コンテンツタイプ: application/javascript
_ jsonp _ を使用している場合を除き、JSONの正しいコンテンツタイプはapplication/json
です。これは実際にはJavaScriptであるため、正しいコンテンツタイプはapplication/javascript
になります。
application/json
がJSONレスポンスに最適な _ mime _ タイプであることは間違いありません。
しかし、私はいくつかの圧縮の問題のために私がapplication/x-javascript
を使わなければならなかったところで若干の経験をしました。私のホスティング環境は GoDaddy とホスティングを共有しています。彼らは私がサーバーの設定を変更することを許可していません。応答を圧縮するためにweb.config
ファイルに次のコードを追加しました。
<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"/>
これを使用することにより、.aspxページはg-Zipで圧縮されましたが、JSON応答は圧縮されませんでした。追加した
<add mimeType="application/json" enabled="true"/>
静的型と動的型の節にあります。 しかし、これはJSONレスポンスをまったく圧縮しません。
その後、この新しく追加されたタイプを削除して追加しました
<add mimeType="application/x-javascript" enabled="true"/>
静的型と動的型の両方のセクションで
.ashx(非同期ハンドラ)
application/x-javascript
そして今、私は私のJSONレスポンスがg-Zipで圧縮されていることを知りました。だから私は個人的に使用することをお勧めします
application/x-javascript
共有ホスティング環境 でJSONレスポンスを圧縮したい場合のみ共有ホスティングでは、 _ iis _ 設定を変更することはできません。
すべてがコンテンツタイプapplication/json
に対して機能するわけではありません。
ファイルのアップロードに Ext JS form送信を使用している場合は、<iframe>
のドキュメントを作成するためにサーバーの応答がブラウザによって解析されることに注意してください。
サーバーが戻りオブジェクトを送信するためにJSONを使用している場合は、テキストを変更せずに文書本体に挿入するようブラウザーに指示するために、Content-Type
ヘッダーをtext/html
に設定する必要があります。
Ext JS 3.4.0 APIドキュメント を参照してください。
JSONは ドメイン固有の言語 (DSL)であり、JavaScriptとは無関係のデータフォーマットであり、それ自体に _ mime _ type、application/json
があります。 MIMEタイプの尊重はもちろんクライアント主導であるので、text/plain
はバイトの転送のためにするかもしれません、しかしそれからあなたは不必要にベンダーアプリケーションドメインへの解釈を押し上げるでしょう - application/json
。 XMLをtext/plain
経由で転送しますか?
しかし、正直に言うと、MIMEタイプの選択は、データtext/plain
またはtext/HTML
(HTMLではない場合)の解釈方法に関するクライアントへのアドバイスです。型指定された言語でObject型のすべてのオブジェクトを作成するのと同じくらい無駄です。
私が知っているブラウザランタイムは、JSON文書を受け取り、介入なしにそれをJavaScriptアクセス可能オブジェクトとして自動的にランタイムに利用可能にするでしょう。しかし、あなたが不自由なクライアントで働いているなら、それは全く別の問題です。しかし、それだけではありません - RESTful JSONサービスにはJavaScriptランタイムがないことが多くありますが、実行可能なデータ交換フォーマットとしてJSONを使用するのを止めることはできません。クライアントがそれほど不自由なのであれば…それなら、代わりに Ajax templatingサービスを介したHTMLインジェクションを検討するでしょう。
アプリケーション/ JSON!
あなたがクライアントサイドの環境にいるなら、クロスブラウザサポートについて調査することはよくサポートされたウェブアプリケーションのために必須です。
他の人もすでに強調しているように、正しいHTTP Content-Typeはapplication/json
ですが、それをうまく処理できないクライアントもあります。そのため、jQueryはデフォルトのtext/html
を推奨します。
正しい答えは:
Content-Type: application/json
他の多くの人が言っているように、application/json
が正しい答えです。
しかし、まだ説明されていないのは、あなたが提案した他のオプションの意味です。
application/x-javascript
:application/javascript
が標準化される前のJavaScript用の実験的MIMEタイプ。
text/javascript
:今は時代遅れです。 javascriptを使うときはapplication/javascript
を使うべきです。
text/x-javascript
:上記の状況に対する実験的なMIMEタイプ。
text/x-json
:application/json
が正式に登録される前のJSON用の実験的MIMEタイプ。
全体的に見て、コンテンツタイプについて疑問があるときはいつでも このリンク をチェックする必要があります。
“ application/json
”は正しいJSONコンテンツタイプです。
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())
}
}
application/json
の IANA登録
このメディアタイプを使用するアプリケーション:JSONは、これらすべてのプログラミング言語(ActionScript、C、C#、Clojure、ColdFusion、Common LISP、E、Erlang、Go、Java、JavaScript、Lua、Objective)で作成されたアプリケーション間でのデータ交換に使用されますCAML、Perl、PHP、Python、Rebol、Ruby、Scala、およびScheme。
あなたは、IANA.org がこれらの他のメディアタイプのどれもリストしていないことに気付くでしょう 実際、application/javascript
でさえ今では時代遅れです。だからapplication/json
は本当に唯一の可能な 正しい answerです。
ブラウザのサポートも別のものです。
最も広くサポートされている非標準メディアタイプはtext/json
またはtext/javascript
です。しかし、ビッグネームの中にはtext/plain
を使用するものもあります。
さらに奇妙なのは、Flickrが送信したContent-Typeヘッダーで、JSONをtext/xml
として返します。 Googleは、その一部のAjax APIにtext/javascript
を使用しています。
例:
curl -I "https://ajax.googleapis.com/ajax/services/search/video?v=1.0&q=jsonexample"
出力:Content-Type: text/javascript
curl -I "https://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=f82254c1491d894f1204d8408f645a93"
出力:Content-Type: text/xml
正しいMIMEタイプはapplication/json
です。
_ but _
私はブラウザの種類やフレームワークのユーザーが必要とする多くの状況を経験しました:
text/html
application/javascript
私は以下を使います
contentType: 'application/json',
data: JSON.stringify(SendData),
投稿時に Content-Type ヘッダーを ' application/json 'に設定する必要があります。要求を待機しているサーバーには、「 Accept = application/json 」を含める必要があります。 Spring MVCでは、このようにすることができます。
@RequestMapping(value="location", method = RequestMethod.POST, headers = "Accept=application/json")
レスポンスにヘッダを追加します。
HttpHeaders headers = new HttpHeaders();
headers.add("Content-Type", "application/json");
Spring には定義済みの型があります:MediaType.APPLICATION_JSON_VALUE
は application/json と同等です。
application/json
はPHPで配列またはオブジェクトデータを格納するのに最適です。
このコードを使用して、JSONのデータを Googleクラウドストレージ(GCS) に設定します。これは 公開されて表示可能 になります。
$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
);
データを取り戻すには簡単です。
$data = json_decode(file_get_contents("gs://BUCKETNAME/FILENAME.json"));
JSONのために、私は使っています:
Content-Type: application/json
これは、IETFのJSON Data Interchange Format 7158の提案、 セクション1.2:JSONの仕様 で説明されています。
JSONがパディング付きの場合はapplication/jsonp
になります。 JSONにパディングがない場合は、application/json
になります。
両方に対処するには、パディングありでもパディングなしでも、 'application/javascript'を使用するのが賢明です。
JSONをRESTコンテキストで使用している場合に、受け入れられた応答を拡張する...
RESTリソースとコレクションを表すときにapplication/x-resource+json
とapplication/x-collection+json
を使うことについて 強い議論 があります。
そして、 jsonapi の仕様に従うことにした場合、 そうあるべきです それが文書化されているので、application/vnd.api+json
の使用。
普遍的な標準はありませんが、転送されるリソースに追加されたセマンティクスが単なるapplication/json
よりも明確なContent-Typeを正当化することは明らかです。
この推論に従って、他の文脈ではより具体的なContent-Typeを正当化することができます。
PHP開発者はこれを使用します。
<?php
header("Content-type: application/json");
// Do something here...
?>
JSONのREST APIからデータを取得する場合はcontent-typeを使用する必要があります。
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 _ (JavaScript Object Notation)と _ jsonp _ ( "JSON with padding")の形式は非常に似ているように思われるため、どのMIMEタイプを使用するべきかは非常にわかりにくいかもしれません。フォーマットは似ていますが、それらの間にはわずかな違いがいくつかあります。
それで、疑いがあるときはいつでも、私は非常に単純なアプローチ(ほとんどの場合は完璧に動作する)を持っています。すなわち、対応するRFC文書を調べて確認します。
_ json _ RFC 4627 (JavaScript Object Notation(JSON)のapplication/jsonメディアタイプ)は、JSON形式の仕様です。セクション6で、JSONテキストのMIMEメディアタイプは
application/json.
_ jsonp _ JSONP( "JSON with padding")は、ブラウザではJSONとは異なる方法で処理されます。 JSONPは通常のJavaScriptスクリプトとして扱われるため、application/javascript,
をJavaScriptの現在の公式MIMEタイプとして使用する必要があります。しかし、多くの場合、text/javascript
MIMEタイプも問題なく動作します。
text/javascript
は RFC 4329 (Scripting Media Types)の文書では時代遅れとしてマークされているので、代わりにapplication/javascript
typeを使用することをお勧めします。しかし、昔からの理由により、text/javascript
は依然として広く使用されており、クロスブラウザをサポートしています(application/javascript
MIMEタイプ、特に古いブラウザでは必ずしもそうとは限りません)。
Content-Type: application/json
- jsonContent-Type: application/javascript
- json-PContent-Type: application/x-javascript
- javascriptContent-Type: text/javascript
- javascript廃止予定、古いIEバージョンはhtml属性として使用されていました。Content-Type: text/x-javascript
- JavaScriptのメディアタイプContent-Type: text/x-json
- 申し込み前のjson/jsonが正式に登録されました。
興味深いJSON結果を指定するには、以下のようにリクエストヘッダーに "application/json"を追加します。
「Accept:application/json」が望ましい応答フォーマットです。
"Content-Type:application/json"はリクエストのコンテンツフォーマットを指定しますが、application/json
とapplication/xml
の両方を指定することもありますが、これらの品質は異なる場合があります。どのサーバーが異なる応答フォーマットを返送するか、例を見てください。
Accept:application/json;q=0.4,application/xml;q=8
XMLは高品質であるため、これはXMLを返します。
現在の正しい標準はapplication/json
です。デフォルトのエンコーディングはUTF-8ですが、UTF-16やutf-32でも構いません。 JSONがUTF-16またはUTF-32で書かれているときは、バイナリcontent-transfer-encodingを使用する必要があります。
Jsonに関するより詳しい情報はここにあります: https://tools.ietf.org/html/rfc4627
バイナリ転送エンコーディングの詳細については、 https://www.w3.org/Protocols/rfc1341/5_Content-Transfer-Encoding.html
残りの答えを補足するために、JSONリンクデータ(JSON-LD) W3Cによる のMIMEタイプは次のとおりです。
application/ld+json
タイプ名: application
サブタイプ名: ld + json
さらに、同じ情報源から。
ファイル拡張子 :
.jsonld
多くのコンテンツタイプがある場合でも、これら3つのコンテンツタイプを常に覚えておくようにしてください 。あなたがより頻繁にこれらを使用しなければならないかもしれないように。