我已经分别尝试了这两件事:
注意: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和内容类型标头都可以正常工作。我们似乎无法在自己的页面上设置内容标题。
答案 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请求。