我需要用JavaScript创建一个Web服务器客户端,我在定义Request头时遇到了一些问题。
我需要POST方法和Content-Type:" application / json"。
我试过了:
$.ajax({
url: 'http://MyWebServiceAddress',
data: JSON.stringify({user:'user',pass:'pass'}),
type: 'POST',
crossDomain: true,
dataType: 'json',
success: function () {
alert("success")
},
error: function (xhr, ajaxOptions, thrownError) {
alert("Error: " + xhr.status + "\n" +
"Message: " + xhr.statusText + "\n" +
"Response: " + xhr.responseText + "\n" + thrownError);
}
});
但是如果我把contentType放在这样:
contentType:' application / json;字符集= UTF-8',
然后查看使用Chrome开发工具的请求我可以看到该方法已更改为" OPTIONS"并输入" text / plain"
任何人都可以帮助我吗?我不必使用Ajax,所以如果有人知道一个好的JavaScript库以使客户端更容易,可能会导致我的问题
答案 0 :(得分:1)
您需要像编写的那样设置contentType
标题; contentType
用于请求本身,而dataType
标头用于您希望从服务器返回的响应。因此,如果您将contentType
添加到$.ajax
请求,则看起来是正确的。
" OPTIONS"请求是一个不同的问题:由于您必须制作一个"跨越来源"请求,这意味着ajax请求的服务地址(http://MyWebServiceAddress
)与当前页面"起源"不同。地址。是这样的吗?例如,如果您的网页来自http://example.com
,并且您正在从该网页向http://twitter.com
发出请求。您可以阅读有关跨源或CORS请求here的更多信息。最重要的是,$.ajax
必须在发布您正在执行的JSON数据之前发出单独的ORIGIN请求,然后它将发出POST请求 - 当且仅当 http://MyWebServiceAddress
处的服务器配置为允许来自您网页域的CORS请求。有关更多详细信息,请参阅上面的CORS链接。
答案 1 :(得分:0)
跨域请求受same origin policy的约束。
他们require permission from the server来:
您已触发后一个条件,因此浏览器使用OPTIONS动词制作preflight request。
服务器需要使用授予权限的CORS标头进行响应。
类似的东西:
Access-Control-Allow-Origin: http://your.server.example.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: Content-Type
......应该做的工作(未经测试)。
当浏览器收到响应时,它将发出POST请求。