为了避免未知,我一直试图避免使用大多数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
?
该Content-Type
头只是作为您的应用程序信息。浏览器不在乎它是什么。浏览器只是从AJAX调用返回数据。如果要将其解析为JSON,则需要自己完成。
标头在那里,因此您的应用程序可以检测到返回了什么数据以及应该如何处理它。您需要查看标头,application/json
然后将其解析为JSON。
实际上,这就是jQuery的工作方式。如果您不告诉它如何处理结果,它将使用Content-Type
来检测要如何处理结果。
Content-Type: application/json
只是内容标题。内容标头只是有关返回数据类型的信息,例如:: JSON,image(png,jpg,..),html。
请记住,JavaScript中的JSON是数组或对象。如果要查看所有数据,请使用console.log而不是alert:
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"}
不要使用双引号。它将混淆JavaScript,因为JSON在每个值和键上都使用双引号:
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>
以下代码可帮助我在前端为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);
});
最近,这个问题和Chrome扩展程序遇到了一个问题,当响应标头将内容类型标记为“ text / html”时,Chrome扩展程序破坏了JSON流,显然,扩展程序可以并且将使用响应标头更改内容,然后再进行进一步处理浏览器。更改内容类型可解决此问题。
文章标签:http , javascript , json , php
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!
评论已关闭!