我需要在JavaScript中创建一个Web服务器客户端,并且我在定义请求标头时遇到了一些问题。
我需要 POST 方法和内容类型:“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开发工具查看请求,我可以看到方法被更改为“选项”,类型被更改为“文本/普通”
有人能帮我吗?我不必使用Ajax,所以如果有人知道一个好的JavaScript库来让客户端更容易,可能会导致我的问题
您确实需要像编写的那样设置contentType
标头;contentType
用于请求本身,而dataType
header用于您希望从服务器返回的响应。因此,如果您将contentType
添加到$.ajax
请求中,它看起来是正确的。
“OPTIONS”请求是一个不同的问题:发送这个请求是因为您必须进行“跨源”请求,这意味着ajax请求的服务地址(< code > http://myweb service address )不同于当前页面的“源”地址。是这样吗?例如,如果您的页面来自< code>http://example.com,并且您正从该页面向< code>http://twitter.com发出请求。你可以在这里阅读更多关于跨来源,或CORS,请求。底线是< code>$。ajax必须像您一样在发送JSON数据之前发出一个单独的源请求,然后它会发出POST请求——当且仅当< code > http://myweb service address 上的服务器配置为允许来自页面域的CORS请求时。更多细节请看上面CORS链接。
跨域请求受相同来源策略的约束。
它们需要服务器的许可才能:
您已经触发了后一种条件,因此浏览器正在使用OPTIONS动词发出预检请求。
服务器需要使用授予权限的CORS标头进行响应。
类似的东西:
Access-Control-Allow-Origin: http://your.server.example.com
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: Content-Type
…应该完成这项工作(未经测试)。
当浏览器收到响应时,它将发出POST请求。