javascript - js跨域请求

原创
2016-06-06 20:31:22 661浏览

$.ajax({
        url : "http://apis.baidu.com/apistore/iplookupservice/iplookup?ip="+window.location.href,

        beforeSend: function(request) {
                        request.setRequestHeader("apikey", "1f5cb934618472891347834b2bf64c8d");
                    },
        type:"GET",
        dataType : "jsonp",
        success : function(data){
            console.log(data);
        }
    });

js请求数据失败。

php成功,为什么?

$ch = curl_init();
        $url = 'http://apis.baidu.com/apistore/iplookupservice/iplookup?ip='.$_SERVER['REMOTE_ADDR'];
        $header = array(
            'apikey:1f5cb934618472891347834b2bf64c8d',
        );
        // 添加apikey到header
        curl_setopt($ch, CURLOPT_HTTPHEADER  , $header);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // 执行HTTP请求
        curl_setopt($ch , CURLOPT_URL , $url);
        $res = curl_exec($ch);

        $info = json_decode($res);

回复内容:

$.ajax({
        url : "http://apis.baidu.com/apistore/iplookupservice/iplookup?ip="+window.location.href,

        beforeSend: function(request) {
                        request.setRequestHeader("apikey", "1f5cb934618472891347834b2bf64c8d");
                    },
        type:"GET",
        dataType : "jsonp",
        success : function(data){
            console.log(data);
        }
    });

js请求数据失败。

php成功,为什么?

$ch = curl_init();
        $url = 'http://apis.baidu.com/apistore/iplookupservice/iplookup?ip='.$_SERVER['REMOTE_ADDR'];
        $header = array(
            'apikey:1f5cb934618472891347834b2bf64c8d',
        );
        // 添加apikey到header
        curl_setopt($ch, CURLOPT_HTTPHEADER  , $header);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // 执行HTTP请求
        curl_setopt($ch , CURLOPT_URL , $url);
        $res = curl_exec($ch);

        $info = json_decode($res);

jQuery中type为jsonp的ajax是不允许自定义请求头的,虽然你在beforeSend里面加了自定义的头apikey,但是由于jsonp的实现是通过

建议:在服务器端做个接口,接口中直接访问百度的API,再把结果返回。

服务器返回的数据格式不对,不应该返回json,应该返回这种格式:
callback({你的json数据内容});

此类api不提供ajax查询 必须在http请求头添加一个指定值的apikey

你不是写明了 JSONP 请求么,那么返回的应该是 JavaScript 代码而非 JSON 数据。

问题还是跨域。
php可以,是因为百度服务端请求头里面设置apikey成功了,
javascript不可以,是因为跨域的规则没通过。 具体是,预请求options 从百度返回的http头部值Access-Control-Request-Headers:*,验证没通过,这一项要列出具体的值(比如apikey),不能是通配符。
参考 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#...

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。