わかりましたので、私は常に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
であることがブラウザに明確に通知されているのに、なぜハンドラ関数からプロパティに直接アクセスできないのか」ということです。
Content-Type
ヘッダーは単にあなたのアプリケーションのための情報として使われます。ブラウザはそれが何であるかを気にしません。ブラウザはAJAX呼び出しからのデータを返すだけです。それをJSONとして解析したい場合は、それを自分で行う必要があります。
ヘッダーはそこにあるので、アプリはどのデータが返されたか、そしてどのようにそれを処理するべきかを検出することができます。ヘッダーを見て、それがapplication/json
であればJSONとしてそれを解析する必要があります。
これが実際にjQueryのしくみです。結果をどうするかわからない場合は、Content-Type
を使用して結果をどうするかを検出します。
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>
以下のコードは私が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);
});