我想访问另一个域上的REST服务。如果在JQuery中,我指定:
dataType: 'json'
正如预期的那样,它失败了,因为对于跨域调用,必须使用JSONP。
当我将其更改为:
dataType: 'jsonp'
它被期望工作,但失败了,因为服务器期望由JSONP请求发送application/json
或application/xml
或text/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调用构建一个代理。这当然是更大的开销,但您可以通过为此类调用添加缓存层来减轻这种开销。