ajax 跨域调用远程接口,获取json数据失败!

言月秋 2016-09-12 11:36:37
调用接口后的响应内容 ,程序代码如下:
$.ajax({
//url在之前已拼接好
//跨域请求的URL
url:url,
async: false,
type : "get",
dataType: "jsonp",
contentType: "application/json;charset=UTF-8",
error: function(XMLHttpRequest, textStatus, errorThrown) {
//200
alert("status:"+XMLHttpRequest.status);
//4
alert("state:"+XMLHttpRequest.readyState);
//parsererror 类型转换错误
alert("textstatus:"+textStatus);
},
// 执行后的数据格式 {"result":0,"data":"0","msg":"DEVICELOCK_STATUS0"}
success: function(json) {
for(var i in json){
alert(i+":"+json[i]);
}
}
});
代码无法执行到success,teststatus一直为parsererror。
...全文
764 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hyurl 2016-09-13
  • 打赏
  • 举报
回复
引用 6 楼 baidu_36128115的回复:
引用 5 楼 yanyueqiu 的回复:
[quote=引用 4 楼 hyurl 的回复:] 不知道你怎么想的,接口里明明是 json ,你用 jsonp 做什么,如果可以跨域,服务器会设置允许你跨域访问,和 jsonp 没关系
如果dataType直接用json,调试时会报已拦截跨源请求:同源策略禁止读取位于:xxxxxxx的远程资源。在不能更改远程接口的情况下,用jsonp确实非常有必要。
两个人回复的都只是一知半解,首先jq的源码我没怎么仔细阅读,但是jsop的方式我还是懂的,jsonp是通过动态SCRIPT标签加载你所访问的远程域的文件,从而达成跨域的原理,而不是你所想要的将datatype设置为jsonp就可以通过访问远程接口获取数据。所以你这里设置jsonp不报同源禁止策略,因为它本身就相当于添加一个script标签,同时将src设置为你设置的url。其次能不能跨域并不是你的电脑直接判断,而是通过返回信息判断的,如果你设置了跨域需要的header信息,服务器也通过了跨域信息的验证,那么即便你是跨域访问,浏览器并不会触发同源禁止策略。还有一点,少用jq不然你会死的很惨,jq的很多功能都有bug, 类似2级xmlhttprequest并不支持这种[/quote] 查了一下,就是指返回的 json 不是 js 不能被执行,jsonp 需要服务器提供支持。所以还是,是否允许跨域,服务器说了算
s000rd 2016-09-13
  • 打赏
  • 举报
回复
先执行 $.support.cors = true; 注释掉下面代码试试 //dataType: "jsonp",
  • 打赏
  • 举报
回复
引用 7 楼 yanyueqiu 的回复:
引用 3 楼 showbo 的回复:
url填写的是yql的接口你填写对没有先,还有q参数where语句。。才是你的数据地址
我把url改成yql接口的值 url: " http://query.yahooapis.com/v1/public/yql", q参数where语句也改了 url: " http://query.yahooapis.com/v1/public/yql", ,调试报错拦截跨源请求
不可能,yql就是专为jsonp的,jsonp没有跨域问题,最多是获取不到数据而已。自己好好看示例
言月秋 2016-09-13
  • 打赏
  • 举报
回复
写错了 q参数 q:"select * from json where url=\'"+url+"' " ,
言月秋 2016-09-13
  • 打赏
  • 举报
回复
引用 3 楼 showbo 的回复:
url填写的是yql的接口你填写对没有先,还有q参数where语句。。才是你的数据地址
我把url改成yql接口的值 url: " http://query.yahooapis.com/v1/public/yql", q参数where语句也改了 url: " http://query.yahooapis.com/v1/public/yql", ,调试报错拦截跨源请求
baidu_36128115 2016-09-13
  • 打赏
  • 举报
回复
引用 5 楼 yanyueqiu 的回复:
引用 4 楼 hyurl 的回复:
不知道你怎么想的,接口里明明是 json ,你用 jsonp 做什么,如果可以跨域,服务器会设置允许你跨域访问,和 jsonp 没关系
如果dataType直接用json,调试时会报已拦截跨源请求:同源策略禁止读取位于:xxxxxxx的远程资源。在不能更改远程接口的情况下,用jsonp确实非常有必要。
两个人回复的都只是一知半解,首先jq的源码我没怎么仔细阅读,但是jsop的方式我还是懂的,jsonp是通过动态SCRIPT标签加载你所访问的远程域的文件,从而达成跨域的原理,而不是你所想要的将datatype设置为jsonp就可以通过访问远程接口获取数据。所以你这里设置jsonp不报同源禁止策略,因为它本身就相当于添加一个script标签,同时将src设置为你设置的url。其次能不能跨域并不是你的电脑直接判断,而是通过返回信息判断的,如果你设置了跨域需要的header信息,服务器也通过了跨域信息的验证,那么即便你是跨域访问,浏览器并不会触发同源禁止策略。还有一点,少用jq不然你会死的很惨,jq的很多功能都有bug, 类似2级xmlhttprequest并不支持这种
言月秋 2016-09-13
  • 打赏
  • 举报
回复
引用 4 楼 hyurl 的回复:
不知道你怎么想的,接口里明明是 json ,你用 jsonp 做什么,如果可以跨域,服务器会设置允许你跨域访问,和 jsonp 没关系
如果dataType直接用json,调试时会报已拦截跨源请求:同源策略禁止读取位于:xxxxxxx的远程资源。在不能更改远程接口的情况下,用jsonp确实非常有必要。
  • 打赏
  • 举报
回复
你得确认对方接口直接jsonp,不支持只返回json数据,你指定dataType为jsonp也没用,这样会就跨域报错或者无法获取数据。。可以用qyl将json转为jsonp数据,参考:JSONP跨域访问在线代理API
hyurl 2016-09-12
  • 打赏
  • 举报
回复
不知道你怎么想的,接口里明明是 json ,你用 jsonp 做什么,如果可以跨域,服务器会设置允许你跨域访问,和 jsonp 没关系
  • 打赏
  • 举报
回复
url填写的是yql的接口你填写对没有先,还有q参数where语句。。才是你的数据地址
言月秋 2016-09-12
  • 打赏
  • 举报
回复
引用 1 楼 showbo 的回复:
你得确认对方接口直接jsonp,不支持只返回json数据,你指定dataType为jsonp也没用,这样会就跨域报错或者无法获取数据。。可以用qyl将json转为jsonp数据,参考:JSONP跨域访问在线代理API
我看了你给的资料,也在代码中添加了data: { //q: "select * from json ", format:"json" }, success 代码块也和它一样的写法success: function (d) { alert(JSON.stringify(d))//远程json数据放在query.results下 },还是一样的错,响应内容依然能看到json,不能执行success代码块。

87,996

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧