最近在用vue写个demo时,使用vue-resource 的$htpp.get()
请求一个json文件时,webstrom本地环境可以获取到,http响应报文包头中content-type为application/json,通过$http.get().then(res => {})
回调函数中的res.body.result
即可获取json文件的内容,但是在上传我的云服务器后请求返回的是content-type:application/octet-stream
:
即返回的是一个二进制流的文件,在下载文件时会用到这个类型,但是res.body.result
就获取不到内容了。
踩坑
前端
在百度搜索相关问题几乎没有,在前端群里没人知道…算是遇到了个奇葩的问题…
首先想到的是在发送get请求时设置http请求报文包头中的content-type=application/json:
1 | Vue.http.options.headers = { |
但是这只是设置报文发送的格式,并没有设置客户端希望服务器返回的内容格式,于是继续设置Accept:
1 | Vue.http.options.headers = { |
测试还是不行,响应报文中content-type
依旧是application/octet-stream
,很苦恼…
服务器
在鼓捣半天确认前端没有错误后,我觉得问题应该出在服务器上。我的服务器centos是基于nginx,于是开始搜索关于nginx不返回json格式内容的问题。得到要在server中配置location拦截:
1 | location ~ ^/get_json { |
这个配置要在nginx.conf中配置(我的配置文件还有个nginx.conf.default,两个都要配置),如果不知道nginx.conf文件在哪,可以使用搜索命令:
1 | find / | grep nginx.conf |
location 具体在文件哪里配置,参考nginx配置文件nginx.conf详细解释
配置文件修改之后要重新运行配置文件,不过要进入/nginx/sbin中执行命令:
1 | ./nginx -s reload |
测试一下还是不行…
最后在stackoverflow上看到了一个问题:Enabling content-type application/json for all the json files in nginx,即nginx中没有设置json文件的content-type为application/json!
于是,找到和nginx.conf同在一个文件夹conf下的mime.types文件和mime.types.default,修改。
1 | vi mime.types |
加上:application/json json;
效果图:
然后重启配置文件,进入/nginx/sbin中执行命令:
1 | ./nginx -s reload |
问题解决!
总结
为什么nginx的默认配置里面没有application/json呢…不科学…
如果你遇到同样的问题,我的建议是先查看mime.types里面有没有application/json的配置,没有就加上,然后测试。无效的话就在nginx.conf中加入location的配置,在js中为get方法配置content-type和accept,就可以了。