用 ajax 无法获取kuaidi100企业版物流数据

代码地址: http://pan.baidu.com/s/1jIigegu

$.ajax({ 
    url: "https://poll.kuaidi100.com/poll/query.do", 
    type: "post", 
    dataType: "jsonp xml", 
    crossDomain: true, 
    jsonp: false, 
    data: "param=%7B%22com%22:%22yunda%22,%20%22num%22:%223839952036097%22%7D&customer=F1D84470F22E2436305F22E374A94B41&sign=54D0F4D61F5304DDD6667BCD0A018AA8", 
    contentType: "application/json; charset=utf-8", 
    async: false, 
    success : function(res){ 
        console.log("on_succeed") 
        console.log(res); 
    }, 
    done: function(d) { 
        console.log("done") 
    }, 
    error : function( httpReq, status, exception){ 
        alert(status+";"+exception); 
    } 
}); 

控制台有报错:Uncaught SyntaxError: Unexpected token :
但是鼠标点击报错的地址,却又能拿到真实数据, 求大神帮忙!

阅读 5.3k
3 个回答

不好意思刚看到消息。你服务器用python?
也无所谓,只要可以就行了。
目前较好的集中解决方式你自己已经罗列出来了:
当请求ip与被请求ip不同时(不在同一环境下),目前最好的解决方案有如下

1. 服务器允许跨域
2. 服务给出jsonp接口(允许回调)
3. 通过爬虫(比较流行的就是Python、cURL(php的)、node.js(用的人少)等),目前最流行的就前两个。

而以上三种解决方案中:
第3种 -> 我最常用也是最喜欢这种(赶紧利落,get/post都不收影响);
第2种 -> 其次推荐
第1种 -> 我个人不推荐,也不喜欢(会创建新script标签来获取数据,如果获取数据频率过高,会影响整体页面,以及获取速度)

关于第2种:如果设置全局允许跨域的话,某些时候可能会带来些安全隐患,所以,可以在请求端提交请求的时候在header中设置关键字(秘钥),被请求端接收请求后判断关键字(秘钥)是否合法,秘钥合法,就向在允许跨域的白名单中添加当前请求端的ip/域名。如果请求秘钥不合法,不予添加

注:不知道你请求成功了没,有问题可以告诉我
新手上路,请多包涵

是不是他们的API里做了限制,不被允许的域名调用时不会给你返回需要的数据

今天找了一天资料,也不知道理解的对不对,想要解决这个问题,有三个解决方案:

  1. 放弃直接js ajax方式获取数据, 在自己的服务器端获取数据,然后再用自己的ajax接口转发数据

  2. 修改poll.kuaidi100.com 服务器支持jsonp类型ajax调用,需要服务器处理callback参数。

  3. 修改poll.kuaidi100.com 服务器将跨域访问限制取消掉,设置 Access-Control-Allow-Origin:* 。

目前就想到了这么多, 也不知道理解有没有错误,暂时选择方案1解决问题。

服务器代码如下:

import requests


def kd100_request():
    pa = 'param={"com":"yunda", "num":"3839952036097"}&customer=F1D84470F22E2436305F22E374A94B41&sign=54D0F4D61F5304DDD6667BCD0A018AA8'
    req = requests.post("https://poll.kuaidi100.com/poll/query.do", params=pa, verify=False)

    return req.json()

print kd100_request()
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进