HTTP Content-Type标头和JSON

时间:2013-12-16 20:30:53

标签: javascript php json http

好的,所以我一直在努力避免使用大多数HTTP协议的属性,或者为了害怕未知,你可以随意调用它们。但是我告诉自己,我今天将面临恐惧并开始有目的地使用标题。我在这里尝试实现的是将json数据发送到浏览器并立即使用它。例如,如果我在就绪状态4上有一个ajax处理函数,看起来像这样

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

我在php

中设置了内容类型标题
header('Content-Type: application/json');
echo json_encode(array('text' => 'omrele'));

我的问题是:当浏览器明确告知传入数据为application/json时,为什么我不能直接从处理函数访问该属性?

4 个答案:

答案 0 :(得分:115)

Content-Type标题仅用作应用程序的信息。浏览器并不关心它是什么。浏览器只返回AJAX调用中的数据。如果你想把它解析为JSON,你需要自己做。

标题就在那里,因此您的应用可以检测返回的数据以及应该如何处理它。您需要查看标题,如果它是application/json,则将其解析为JSON。

这实际上就是jQuery的工作原理。如果您不告诉它如何处理结果,它会使用Content-Type来检测如何处理它。

答案 1 :(得分:7)

Content-Type: application/json只是内容标题,内容标题只是有关返回数据类型的信息,ex :: JSON,image(png,jpg等),html。 请记住,javascript中的JSON是一个数组或对象。 如果要查看所有数据,请使用console.log而不是alert

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"}

不要使用双引号,它会混淆javascript,因为JSON在每个值和键上使用双引号:

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

//it will return wrong javascript code: 
<script>var returndata="{"text":"omrele"}";</script>

答案 2 :(得分:0)

下面的代码帮助我在FronEnd中为js返回一个json对象

我的模板代码 template_file.json

db = MySQLdb.connect(host="xxx.xx.xx.x",   
                     user="xxx",       
                     passwd="xxx",  
                     db="xxxx")
cursor = db.cursor()
cursor.executemany('Insert Query',json_data)
db.commit()
cursor.close()
db.close()

python支持的代码

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

<强> url.py

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")    

FrontEnd的Jquery代码

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

答案 3 :(得分:0)

最近,与此相关的一个问题是,当响应标头将内容类型标记为“ text / html”时,Chrome扩展程序破坏了JSON流,显然,扩展程序可以并且将使用响应标头在更改内容之前浏览器进一步处理。更改内容类型可解决此问题。