XMLHttpRequest / ajax设置Content-Type

时间:2016-06-06 18:21:49

标签: javascript jquery json ajax

我已经分别尝试了这两件事:

注意:url是一个包含https url的变量,jsonString包含一个有效的json字符串

var request = new XMLHttpRequest();
try{
    request.open("POST", url);
    request.setRequestHeader('Accept', 'application/json');
    request.send(jsonString);
} catch(e) {
    alert(e);
}

var options = {
    type: "POST",
    url: url,
    dataType: "json",
    data: jsonString,
    accept: "application/json"
};

$.ajax(options)

问题是我们发布的系统要求标题Content-Type的值为" application / json"。

按照现在的方式,使用的方法是POST,Accept标头是" application / json",Content-Type默认为" application / x-www-form -urlencoded;字符集= UTF-8"

在第一个例子中,如果request.setRequestHeader('Content-Type', 'application/json');在Accept标题的上方或下方添加1行,使用的方法更改为OPTIONS,Accept标题更改为" text / html,application / xhtml + xml,application / xml; q = 0.9, / ; q = 0.8" 内容类型标题消失,就好像它没有被看到一样。

在第二个示例中,如果 contentType:" application / json" 添加到选项中的任何位置,则会发生与第一个示例中相同的事情。

在ajax或XMLHttpRequest中设置Content-Type标头的正确方法是什么?

编辑:我应该添加使用firefox rest客户端插件,json字符串,url,以及accept和内容类型标头都可以正常工作。我们似乎无法在自己的页面上设置内容标题。

1 个答案:

答案 0 :(得分:7)

  

在第一个示例中,如果是request.setRequestHeader(' Content-Type',' application / json');在Accept标头的上方或下方添加1行,使用的方法更改为OPTIONS

这是因为您在网页中嵌入了JS a cross origin request。更改content-type(使用简单的HTML表单无法进行更改)会触发a preflight request向服务器请求权限以发出实际请求。

您需要设置服务器以使用适当的CORS标头进行响应以授予权限。

HTTP/1.1 200 OK
Date: Mon, 01 Dec 2008 01:15:39 GMT
Access-Control-Allow-Origin: http://your.site.example.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: Content-Type

然后浏览器会发出你要求它发出的POST请求。