HTTP Content-TypeヘッダーとJSON


144

私はいつも、未知のものを恐れるために、HTTPプロトコルのプロパティのほとんどを使用しないようにしています。

しかし、今日は恐怖に直面し、意図的にヘッダーを使用し始めると自分に言い聞かせました。私はjsonブラウザにデータを送信してすぐにそれを使用しようとしています。たとえば、準備状態4に次のようなAjaxハンドラー関数があるとします。

function ajaxHandler(response){
    alert(response.text);
}

そして、PHPコードにcontent-typeヘッダーを設定しました。

header('Content-Type: application/json');
echo json_encode(array('text' => 'omrele'));

ブラウザーに着信データがあることが明確に通知されているのに、ハンドラー関数からプロパティに直接アクセスできないのはなぜapplication/jsonですか?


正しく理解できたら、text応答ではなくハンドラーでJavaScript変数として使用しますか?それは非常に奇妙な機能でしょう。json_encodeは、PHP配列から1つのオブジェクトも作成します。したがって、これをJavaScriptに取り込む場合は、変数に割り当てる必要があります。
2013

4
contentTypeヘッダーは情報のみです。ブラウザはそれが可能な場合にそれを使用しますが、この場合、ブラウザは通常、意図が何であるかを知らないため、単にそれを無視します。Javascriptアプリケーションはそれを利用できます。JSONが表示されることを前提としているため、JSONでデコードできますJSON.parse()。別のアクションを実行するか、間違ったcontentTypeが表示された場合はエラーを強制することができます。

1
ブラウザはJSONテキストを自動的に解析しないためresponse.text、文字列のままです。
nnnnnn

1
つまり、そのヘッダーを設定しても何も変わらないと私に言うつもりですか?それでその存在の目的は何ですか?
php_nub_qq 2013

2
@php_nub_qq:これは、アプリケーションが適切に処理できるように、サーバーが何を返したかを通知することを目的としています。ブラウザはあなたのためのJSONの解析を行いません、あなたのアプリはそれをする必要があります。このヘッダーは、それが(またはJSONである必要がある)であることを示しています。
Rocket Hazmat 2013

回答:


136

Content-Typeヘッダは、ちょうどあなたのアプリケーションのための情報として使用されています。ブラウザはそれが何であるかを気にしません。ブラウザーはAJAX呼び出しからのデータを返すだけです。JSONとして解析する場合は、自分で行う必要があります。

ヘッダーはそこにあるので、アプリは返されたデータとその処理方法を検出できます。ヘッダーを確認する必要がありapplication/jsonます。ヘッダーの場合は、JSONとして解析します。

これがjQueryの実際の動作方法です。結果の処理方法を指定しない場合は、Content-Typeを使用して処理方法を検出します。


12
それは完全に真実ではありません。使用せずにheader('Content-Type: application/json');ダウンロードを強制Content-Disposition: attachment; filename=myfile.jsonすると、最終的にはになりますmyfile.json.html。このjsonヘッダーを使用すると、を取得できますmyfile.json
Remi Grumeau 2016年

4
@RemiGrumeau「完全に真実ではない」とは何ですか?ブラウザでのファイルのダウンロードは、まったく別のものです。ブラウザはおそらくデフォルトでHTMLを想定するため、特に指定がない限り、受信するものはすべてHTMLであると想定します。ダウンロード時には.html、デフォルトでファイルに追加されます。
bzeaman 2017

2
私はここで問題の完全なコンテキストを知りません-しかし、ブラウザ(およびJavaScript)は時々Content-Typeを気にします。このヘッダーは、ブラウザーがコンテンツを表示するために使用するヒューリスティックに影響を与える可能性があり、コンテンツタイプがtext / htmlのXMLとJSONを送信すると、基盤となるXHRリクエスト(またはそれらの上にあるフレームワークのレイヤー)に微妙なバグが発生することがよくあります
Alan Storm

7

Content-Type: application/json単なるコンテンツヘッダーです。コンテンツヘッダーは、返されるデータのタイプに関する情報だけです。例:: JSON、image(png、jpg、etc ..)、html。

JavaScriptのJSONは配列またはオブジェクトであることを覚えておいてください。すべてのデータを表示するには、アラートの代わりにconsole.logを使用します。

alert(response.text); // Will alert "[object Object]" string
console.log(response.text); // Will log all data objects

元のJSONコンテンツを文字列として通知する場合は、単一引用符( ')を追加します。

echo "'" . json_encode(array('text' => 'omrele')) . "'";
// alert(response.text) will alert {"text":"omrele"}

二重引用符は使用しないでください。JSONは各値とキーに二重引用符を使用するため、JavaScriptを混乱させます。

echo '<script>var returndata=';
echo '"' . json_encode(array('text' => 'omrele')) . '"';
echo ';</script>';

// It will return the wrong JavaScript code:
<script>var returndata="{"text":"omrele"}";</script>

これを行わないでください。単一引用符を使用して文字列をecho "'" . json_encode(array('text' => 'it\'s wrong')) . "'"; 分割します(多くの言語で頻繁に発生します) '{"text":"it's wrong"}'。代わりにこれを使用しますjson_encode(json_encode(array('text' => 'it\'s good')))。結果は正しくエスケープされます:"{\"text\":\"it's wrong\"}"
PofMagicfingers

1

以下のコードは、フロントエンドでJavaScriptのJSONオブジェクトを返すのに役立ちます

私のテンプレートコード

template_file.json

{
    "name": "{{name}}"
}

Python支援コード

def download_json(request):
    print("Downloading JSON")
    # Response render a template as JSON object
    return HttpResponse(render_to_response("template_file.json",dict(name="Alex Vera")),content_type="application/json")    

ファイルurl.py

url(r'^download_as_json/$', views.download_json, name='download_json-url')

フロントエンドのjQueryコード

  $.ajax({
        url:'{% url 'download_json-url' %}'        
    }).done(function(data){
        console.log('json ', data);
        console.log('Name', data.name);
        alert('hello ' + data.name);
    });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.