jQuery和CORS

时间:2014-01-02 15:37:35

标签: ajax jsonp cors

如果服务器没有使用JSONP响应,我该如何处理?我用$ .ajax尝试了几个选项,但无法让它工作。

CodePen Example

//var url = 'https://coinbase.com/api/v1/currencies/exchange_rates';
var url = 'http://blockchain.info/ticker';
$.ajax({
    type: 'GET',
    url: url,
    //jsonpCallback: 'jsonCallback',
    contentType: 'application/json',
    //async: false,
    //dataType: 'jsonp',

    //xhrFields: { 
    // for CORS?
    //  withCredentials: false
    //},
    success: function (json) {
        debugger;
    },
    error: function (json) {
     debugger;
    }
});

3 个答案:

答案 0 :(得分:5)

看起来您正在尝试向blockchain.info发送AJAX请求并检索JSON提要。幸运的是,他们增加了对CORS的支持。

只需将参数cors=true传递给请求的网址(例如http://blockchain.info/ticker?cors=true),您就可以获取数据。

根据https://blockchain.info/api/blockchain_api,只支持几个API调用支持CORS。

答案 1 :(得分:0)

请求:

$.ajax({
            url: "http://yoururl",
            type: "POST",
            crossDomain: true,
            data: JSON.stringify(somejson),
            dataType: "json",
            success: function (response) {
                var resp = JSON.parse(response)
                alert(resp.status);
            },
            error: function (xhr, status) {
                alert("error");
            }
        });

来自服务器的示例响应(在Python中 - Django)

response = HttpResponse(json.dumps('{"status" : "success"}'))
response.__setitem__("Content-type", "application/json")
response.__setitem__("Access-Control-Allow-Origin", "*")

return response

基本上,您必须更改服务器端的响应标头。

答案 2 :(得分:0)

听起来你正在对不支持JSONP的服务器进行跨域请求。

有很好的理由说明浏览器拒绝来自不希望在跨域请求中使用其数据的服务器的数据。如果浏览器没有这样做,那么整个网络上都存在大量的安全问题。因此,服务器需要允许此操作。

服务器基本上有两种方式可以允许:通过JSONP的旧丑陋方式,但你说它不支持这种方式。虽然您仍然可以尝试将您的网址更改为'http://blockchain.info/ticker?callback=?',将数据类型更改为jsonp。

但是还有一种新的,干净的CORS标题方式。如果服务器在其响应中添加了Accept-Control-Allow-Origin: *标头,则任何人(使用现代浏览器)都可以使用普通Ajax调用的数据。

如果服务器不允许您使用其数据,则表示运气不佳。