如何使用dataType:'jsonp'但仍然在Accept头中有application / json?

时间:2012-07-30 16:27:00

标签: jquery json http jsonp

我想访问另一个域上的REST服务。如果,在JQuery中,我指定:

dataType: 'json'

正如预期的那样失败,因为对于跨域调用,必须使用JSONP。

当我将其更改为:

dataType: 'jsonp'

预计会有效,但会失败,因为服务器需要{J}请求发送的application/jsonapplication/xmltext/html等,而不是*/*

有没有办法强制JQuery在执行JSON请求时将application/json放入Accept请求标头?

3 个答案:

答案 0 :(得分:5)

AFAIK jQuery的JSONP实现使用注入DOM的<script>标记(因此仅对GET动词的限制),您无法控制Accept请求内容类型标头。此src标记的script只是指向远程域网址。浏览器只是简单地获取发送常规GET请求的基础端点。

因此,如果您希望能够为跨域调用设置请求标头,则必须在您的域上设置服务器端脚本,该脚本将调用委托给远程域(并设置相应的标头),然后发送AJAX请求你的脚本。

答案 1 :(得分:0)

我想你会想要尝试这些方面:

$.ajax({
    headers: { 
        Accept : "application/json; charset=utf-8",
        "Content-Type": "text/plain; charset=utf-8"
    }
    dataType: 'jsonp',
    success : function(response) {
        ...
    }
})

答案 2 :(得分:0)

这可能不适合您的用例,但是当我不得不进行跨域AJAX时,我通常只会在我的域中添加一个额外的资源,然后调用外部资源(通过cURL或其他)和将值返回给调用客户端。实质上,您正在为AJAX调用构建代理。它肯定是更多的开销,但您可以通过为此类调用添加缓存层来缓解这种情况。