vue-resource jsonp跨域请求数据报错

vue 阅读:727

今天在使用Vue-resource碰到跨域请求的问题。来看报错的console:

image.png

后端服务器返回的是json的数据:

 r = json.dumps({"name":"desk","totalmoney":219})
 return HttpResponse(r, content_type='application/json')

直接通过浏览器访问发现是正常的:

image.png


控制台没有像我预料的那样输出正确的数据,这个时候在去看看network的请求状况:

image.png


image.png

我们看到请求是成功了,正常200的return code,在response栏目中看到数据也返回了,那到底是为啥报错呢?

来看看我们前端的代码:

image.png

前端请求不没有带任何的参数,但是我们在network的栏目中可以看到请求传了两个参数pageID=29&_callback=_jsonp86alw7otd3c

通过源码发现:

image.png

image.png

实际上callback是随机生成的字符串,并且这个参数名我们也可以自己给他命名,如果没指定,默认是“callback”,既然默认传递的参数,那就肯定是有用的。 
其实vue发送jsonp还有两个参数,我们来看看

Vue.http.jsonp(url,{params: {pageID:29},jsonp:"_callback"})

这里params是要发送的数据对象,jsonp是设置回调的名称,也就是上面的callback名称;(不设置默认为callback),现在我们就需要后台协助一下,获取我们发送过去的”_callpack”的值,将这个值拼接到返回的json数据上,这时候就可以了!

通过查看jsonp的百度说明发现:

jsonp实际是利用<script>元素的开放策略,动态的从其他网页来加载json数据。

用jsonp接受到的数据并不是json,是任意的javascript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。


客户端期望返回的json数据是:{"name":"desk","totalmoney":219}

那么真正返回给客户端的script tags是:callbackfunction({"name":"desk","totalmoney":219})


修改前端的代码:

image.png


同时还需要修改后端的代码:

callback = request.GET.get("_callback")
result = {"name":"desk","totalmoney":219}
r = callback+"("+str(result)+")"
return HttpResponse(r, content_type='application/json')


运行结果:

image.png参考链接:

https://github.com/pagekit/vue-resource/blob/develop/docs/http.md

https://baike.baidu.com/item/jsonp/493658?fr=aladdin