Heim > Backend-Entwicklung > PHP-Tutorial > javascript - js跨域请求

javascript - js跨域请求

WBOY
Freigeben: 2016-06-06 20:31:22
Original
986 Leute haben es durchsucht

<code>$.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);
        }
    });
</code>
Nach dem Login kopieren
Nach dem Login kopieren

js请求数据失败。
javascript - js跨域请求
php成功,为什么?

<code>$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);
</code>
Nach dem Login kopieren
Nach dem Login kopieren

回复内容:

<code>$.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);
        }
    });
</code>
Nach dem Login kopieren
Nach dem Login kopieren

js请求数据失败。
javascript - js跨域请求
php成功,为什么?

<code>$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);
</code>
Nach dem Login kopieren
Nach dem Login kopieren

jQuery中type为jsonp的ajax是不允许自定义请求头的,虽然你在beforeSend里面加了自定义的头apikey,但是由于jsonp的实现是通过<script>标签而不是XMLHttpRequest对象,你设置的自定义头是无效的,所以百度返回给你的结果是Missing apikey。<br> 参考:http://www.jquery123.com/jQuery.ajax/ (搜索“愚人码头注”字眼)</script>

建议:在服务器端做个接口,接口中直接访问百度的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#...

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage