JQuery - Firefox中的$ .ajax ContentType问题

时间:2011-08-24 17:39:33

标签: jquery

我正在使用以下代码来制作跨域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”中添加和删除代码,但无济于事。

有什么建议吗?

3 个答案:

答案 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等...代理是最好的选择。