XMLHttpRequest/ajax设置Content-Type

bac*_*cab 11 javascript ajax jquery json

我分别试过这两件事:

注意: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);
}
Run Code Online (Sandbox Code Playgroud)

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

$.ajax(options)
Run Code Online (Sandbox Code Playgroud)

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

通过现在的方式,使用的方法是POST,Accept标头是"application/json",Content-Type默认为"application/x-www-form-urlencoded; charset = 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"并且Content-Type标题消失,就好像没有看到一样.

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

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

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

Que*_*tin 7

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

这是因为你在做一个跨源请求,从JS嵌入网页.更改content-type(使用简单的HTML表单无法创建的那个)会触发预检请求,请求服务器发出实际请求的权限.

您需要设置服务器以使用适当的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
Run Code Online (Sandbox Code Playgroud)

然后浏览器将发出您要求它发出的POST请求.

  • @backcab - 因为它是安装软件而不是来自不受信任的网站的一点JavaScript. (2认同)