我正在使用以下代码来制作跨域JSON请求,
$.ajax({
type:"POST",
crossDomain:true,
contentType: "application/json; charset=utf-8",
data: {
domain: 'domain',
assettypes: 'Article',
sortby: 'mostreadcounter_total',
pagesize: '3',
format: 'json',
apikey: 'apiKey'
},
url: 'http://www.sample.com/search',
dataType: "json",
success: CallSucceed,
failure: CallFail,
beforeSend: function(x) {
if (x && x.overrideMimeType) {
x.overrideMimeType("application/json;charset=UTF-8");
}
}
});
但我的电话失败了。在小提琴手中,我看到内容类型为'text / html; charset = UTF-8'而我明确将contentType设置为'application / json; charset = UTF-8'。
当我使用浏览器访问API时,它工作正常,Fiddler显示正确的内容类型。但是一旦我使用JQuery发出请求,我的内容类型就会切换到text / html,我的请求会因405错误而失败(方法不允许。)
仅在Firefox 3.6中发生这种情况,而不是在IE中:(我已尝试过两种Get / POSt方法,我尝试在“BeforeSend”中添加和删除代码,但无济于事。
有什么建议吗?
答案 0 :(得分:1)
1。您不能使用post方法执行跨浏览器的ajax请求,只能使用get
2。可以使用JSONP
而不是JSON
来实现跨浏览器的ajax请求,是的,它们在某种程度上是不同的。
3。您需要能够在服务器端处理JSONP
个请求。
JSONP
请求的jQuery示例代码var data = {
domain: 'domain',
assettypes: 'Article',
sortby: 'mostreadcounter_total',
pagesize: '3',
format: 'json',
apikey: 'apiKey'
};
$.ajax({
url: 'http://www.sample.com/search?callback=?',
data: data,
success: CallSucceed,
failure: CallFail,
dataType: 'jsonp'
});
JSONP
请求的PHP示例代码$domain = $_GET['domain'];
$assettypes = $_GET['assettypes'];
// ... and so on
// you need the callback(success handler) name,
// so you can pass your JSON object to it
$callback = $_GET['callback'];
echo $callback.'('.json_encode(array('success' => true, /* and so on */)).')';
答案 1 :(得分:0)
设置contentType: "application/json"
,省略编码。 JQuery总是使用UTF-8,并且可能不期望将编码附加到最后。
来自JQuery文档:
contentTypeString
默认值:'application / x-www-form-urlencoded'
将数据发送到服务器时,请使用此内容类型。默认是 “application / x-www-form-urlencoded”,对大多数情况来说都很好。如果 你明确地将内容类型传递给$ .ajax()然后它将永远是 发送到服务器(即使没有数据发送)。数据永远是 使用UTF-8字符集传输到服务器;你必须解码这个 适当地在服务器端。
另请注意,要在Javascript中进行跨域调用,您的远程服务器必须实现JSONP Standard/Hack。如果您正在调用的服务支持它,您只需在URL的末尾添加?
,jQuery将负责处理它。
url: 'http://www.sample.com/search?',
答案 2 :(得分:0)
请在此处查看我的回答:stackoverflow answer for cross domain ajax calls
Javascript无法进行跨域调用。它在IE中“工作”的原因可能是你做了一个POST并没有真正看到结果。不同的浏览器以不同的方式处理这种类型的事情,IE确实允许POST到远程服务器,而FF则不允许。
设置JSP,ASP,PHP等...代理是最好的选择。