在Python/GAE中以正确方式返回JSON供JavaScript解析吗?

2 投票
2 回答
3720 浏览
提问于 2025-04-15 12:37

我正在为我的网页应用在GAE上用Python制作一个与AJAX相关的API。在把内容类型设置为'application/json'后,我直接访问我的网址-

http://mysite.com/api?method=theMethod&param=firstParam

-结果弹出了一个“保存文件”的对话框,而不是显示JSON对象。打开这个文件时,里面确实包含了JSON对象。

这样从Python通过GAE返回JSON,供JavaScript解析,算是正确的做法吗?

from django.utils import simplejson
self.response.headers['Content-Type'] = 'application/json'
jsonData = {"foo" : "bar"}
self.response.out.write(simplejson.dumps(jsonData))

我注意到,当我使用其他地方的API,比如Flickr时,我的浏览器会直接显示JSON对象,而不是让我保存文件。这种行为让我想要检查一下我的实现。我的唯一想法是这可能和JSONP的实现有关。

根据rfc4627,我应该使用'application/json'。

2 个回答

1

我觉得Flickr的API返回的数据类型是'text/plain',所以它会被当作普通文本显示。你可以试试'text/json',这可能是一个折中的选择。在你的情况下,能方便查看可能比准确性更重要。

另外,要考虑到如果有客户端需要内容类型是'application/json',而不接受'text/plain',那么这个客户端应该明确要求它想要的类型,而不是用'/'。这可能是你在准备响应的内容类型时需要注意的情况,你也可以相应地记录你的服务。

查看请求:

http://www.flickr.com/services/rest/?method=flickr.test.echo&format=json&api_key=cecc9218c59188ebc6150eff9cd908dc

请求头

Accept:application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Referer:http://www.flickr.com/services/api/response.json.html
User-Agent:Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_7; en-us) AppleWebKit/530.18 (KHTML, like Gecko) Version/4.0.1 Safari/530.18

响应头

Connection:close
Content-Encoding:gzip
Content-Length:134
Content-Type:text/plain; charset=utf-8
Date:Thu, 02 Jul 2009 03:19:34 GMT
P3p:policyref="http://p3p.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"
Vary:Accept-Encoding

内容

jsonFlickrApi({"method":{"_content":"flickr.test.echo"}, "format":{"_content":"json"}, "api_key":{"_content":"cecc9218c59188ebc6150eff9cd908dc"}, "stat":"ok"})
4

这是正确的做法,JSON的mime类型应该是application/json,而不是text/json,更不能是text/html。这个链接开头就说了“application/json是JavaScript对象表示法(JSON)的媒体类型”。

想了解更多细节和选项,可以看看这个链接

撰写回答