contentType:’application / json’和POST方法(JavaScript)

我需要用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库来使客户端更容易,可能会导致我的问题

您需要像编写时一样设置contentType标头; contentType用于请求本身,而dataType标头用于您期望从服务器返回的响应。 因此,如果将该contentType添加到$.ajax请求,它看起来是正确的。

“OPTIONS”请求是一个不同的问题:因为您必须发出“跨域”请求而发送,这意味着ajax请求的服务地址( http://MyWebServiceAddress )与当前页面的“origin”地址不同。 是这样的吗? 例如,如果您的页面来自http://example.com ,并且您正在从该页面向http://twitter.com发出请求。 您可以在此处阅读有关跨源或CORS请求的更多信息 。 底线是$.ajax必须在发布JSON数据之前发出单独的ORIGIN请求,然后它会发出POST请求 – 当且仅当 http://MyWebServiceAddress的服务器配置为允许来自您网页域的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请求。