web-dev-qa-db-ja.com

HTTPコンテンツタイプヘッダとJSON

わかりましたので、私は常にHTTPプロトコルのプロパティの大部分を使うことを避けようとしてきました。しかし、私は自分自身に今日は恐れに直面し、意図的にヘッダを使い始めるつもりであると言いました。私がここで達成しようとしてきたのは、jsonデータをブラウザに送信してすぐにそれを使用することです。例えば、私がajaxハンドラー関数を準備完了状態4にしているとしたら、そのように見えます。

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

そして私は私のphpでcontent-typeヘッダを設定しました

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

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

118
php_nub_qq

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

ヘッダーはそこにあるので、アプリはどのデータが返されたか、そしてどのようにそれを処理するべきかを検出することができます。ヘッダーを見て、それがapplication/jsonであればJSONとしてそれを解析する必要があります。

これが実際にjQueryのしくみです。結果をどうするかわからない場合は、Content-Typeを使用して結果をどうするかを検出します。

114
Rocket Hazmat

Content-Type: application/jsonは単なるコンテンツヘッダー、コンテンツヘッダーは返されるデータの種類に関する情報、ex :: JSON、image(png、jpgなど)、htmlです。 JavascriptのJSONは配列またはオブジェクトです。すべてのデータを見たい場合は、alertの代わりにconsole.logを使用してください。

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

元の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 wrong javascript code: 
<script>var returndata="{"text":"omrele"}";</script>
7
Among Amrul

以下のコードは私がFronEndでjsのための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')

FrontEndのJqueryコード

  $.ajax({
        url:'{% url 'download_json-url' %}'        
    }).done(function(data){
        console.log('json ',data);
        console.log('Name',data.name);
        alert('hello '+data.name);
    });
0
Alex Vera