如何使用数据类型:'jsonp'但在接受标头中仍然有应用程序/json?



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

dataType: 'json'

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

当我将其更改为:

dataType: 'jsonp'

它被期望工作,但失败了,因为服务器期望由JSONP请求发送application/jsonapplication/xmltext/html等,而不是*/*

有没有一种方法可以强制JQuery在执行JSON请求时将application/json放在Accept请求头中?

AFAIK-jQuery对JSONP的实现使用了一个<script>标记,该标记被注入到DOM中(因此仅限于GET谓词),您无法控制其Accept请求内容类型标头。该script标记的src简单地指向远程域url。浏览器只是简单地获取发送常规GET请求的底层端点。

因此,如果你想为跨域调用设置请求头,你必须在你的域上设置一个服务器端脚本,将调用委托给远程域(并设置相应的头),然后将AJAX请求发送到你的脚本。

我想你会想尝试一些类似的东西:

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

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

最新更新