无法在jQuery.ajax中将content-type设置为“application / json”

当我有这个代码

$.ajax({ type: 'POST', //contentType: "application/json", url: 'http://localhost:16329/Hello', data: { name: 'norm' }, dataType: 'json' }); 

在提琴手我可以看到下面的原始请求

 POST http://localhost:16329/Hello HTTP/1.1 Host: localhost:16329 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 Accept: application/json, text/javascript, */*; q=0.01 Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Referer: http://localhost:14693/WebSite1/index.html Content-Length: 9 Origin: http://localhost:14693 Pragma: no-cache Cache-Control: no-cache name=norm 

但是我想要的是从application / x-www-form-urlencoded中将content-type设置为application / json 。 但是这个代码

 $.ajax({ type: "POST", contentType: "application/json", url: 'http://localhost:16329/Hello', data: { name: 'norm' }, dataType: "json" }); 

产生奇怪的请求(我可以看到在提琴手)

 OPTIONS http://localhost:16329/Hello HTTP/1.1 Host: localhost:16329 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: ru-ru,ru;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive Origin: http://localhost:14693 Access-Control-Request-Method: POST Access-Control-Request-Headers: content-type Pragma: no-cache Cache-Control: no-cache 

这是为什么? 什么是OPTIONS当它应该在那里? 我的内容types设置为application / json在哪里? 而请求参数已经出于某种原因。

更新1

在服务器端,我有非常简单的RESTful服务。

 [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class RestfulService : IRestfulService { [WebInvoke( Method = "POST", UriTemplate = "Hello", ResponseFormat = WebMessageFormat.Json)] public string HelloWorld(string name) { return "hello, " + name; } } 

但出于某种原因,我不能用参数调用这个方法。

更新2

对不起,没有回答这么久。

我已经将这些标题添加到我的服务器响应

  Access-Control-Allow-Origin: * Access-Control-Allow-Headers: Content-Type Access-Control-Allow-Methods: POST, GET, OPTIONS 

它没有帮助,我有方法不允许服务器错误。

这是我的提琴手所说的

在这里输入图像说明

所以,现在我可以确定我的服务器接受POST,GET,OPTIONS (如果响应头像我所期望的那样工作)。 但为什么“方法不允许”?

在服务器的WebView响应中(您可以在上面的图片中看到Raw响应)看起来像这样

在这里输入图像说明

看起来,从url选项中删除http://可确保发送正确的HTTP POST标头。

我不认为你需要完全限定主机的名称,只需使用相对URL如下。

  $.ajax({ type: "POST", contentType: "application/json", url: '/Hello', data: { name: 'norm' }, dataType: "json" }); 

我的一个例子是:

  $.ajax({ type: "POST", url: siteRoot + "api/SpaceGame/AddPlayer", async: false, data: JSON.stringify({ Name: playersShip.name, Credits: playersShip.credits }), contentType: "application/json", complete: function (data) { console.log(data); wait = false; } }); 

可能有关: jQuery $ .ajax(),$ .post在Firefox中将REQUEST_METHOD作为“OPTIONS”发送

编辑:经过一些更多的研究后,我发现OPTIONS头被用来找出是否允许来自原始域的请求。 使用fiddler,我将以下内容添加到来自服务器的响应头文件中。

  Access-Control-Allow-Origin: * Access-Control-Allow-Headers: Content-Type Access-Control-Allow-Methods: POST, GET, OPTIONS 

一旦浏览器收到这个响应,然后用json数据发送正确的POST请求。 这似乎是默认的formsurlencoded内容types被认为是安全的,所以不经过额外的跨域检查。

看起来您需要将前面提到的标题添加到您的服务器响应OPTIONS请求。 你当然应该configuration它们来允许来自特定域的请求,而不是全部。

我用下面的jQuery来testing这个。

 $.ajax({ type: "POST", url: "http://myDomain.com/path/AddPlayer", data: JSON.stringify({ Name: "Test", Credits: 0 }), //contentType: "application/json", dataType: 'json', complete: function(data) { $("content").html(data); } });​ 

参考文献:

我可以告诉你我是如何使用它的

  function GetDenierValue() { var denierid = $("#productDenierid").val() == '' ? 0 : $("#productDenierid").val(); var param = { 'productDenierid': denierid }; $.ajax({ url: "/Admin/ProductComposition/GetDenierValue", dataType: "json", contentType: "application/json;charset=utf-8", type: "POST", data: JSON.stringify(param), success: function (msg) { if (msg != null) { return msg.URL; } } }); } 

所以你所需要做的就是增加:

 headers: { 'Accept': 'application/json', 'Content-Type': 'application/json' } 

作为您的发布请求的一个字段,它会工作。

我认识到这些屏幕,我使用CodeFluentEntities,我也有解决scheme。

我正在使用这种结构:

 $.ajax({ url: path, type: "POST", contentType: "text/plain", data: {"some":"some"} } 

正如你所看到的,如果我使用

 contentType: "", 

要么

 contentType: "text/plain", //chrome 

一切工作正常。

我不是100%确定这是你所需要的,因为我也改变了标题。

我在这里find了解决这个问题的方法。 不要忘记在IIS应用程序服务处理程序上允许动词选项。

工作正常。 谢谢AndréPedroso。 🙂

我遇到过同样的问题。 我正在jboss服务器上运行java rest应用程序。 但是我认为这个解决scheme在一个ASP .NET的webapp上是类似的。

Firefox会预先调用您的服务器/resturl来检查哪些选项是允许的。 这是您的服务器没有相应回复的“选项”请求。 如果这个OPTIONS调用被正确回复,则会执行第二个调用,这是对json内容的实际“POST”请求。

这只在执行跨域调用时发生。 在你的情况下调用“ http://localhost:16329/Hello ”,而不是调用同一个域下的urlpath“/ Hello”

如果您打算进行跨域调用,则必须使用带注释的方法来增强您的rest服务类,并支持“OPTIONS”http请求。 这是相应的Java实现:

 @Path("/rest") public class RestfulService { @POST @Path("/Hello") @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.TEXT_PLAIN) public string HelloWorld(string name) { return "hello, " + name; } //THIS NEEDS TO BE ADDED ADDITIONALLY IF MAKING CROSS-DOMAIN CALLS @OPTIONS @Path("/Hello") @Produces(MediaType.TEXT_PLAIN+ ";charset=utf-8") public Response checkOptions(){ return Response.status(200) .header("Access-Control-Allow-Origin", "*") .header("Access-Control-Allow-Headers", "Content-Type") .header("Access-Control-Allow-Methods", "POST, OPTIONS") //CAN BE ENHANCED WITH OTHER HTTP CALL METHODS .build(); } } 

所以我想在.NET中你必须添加一个附加的方法注释

 [WebInvoke( Method = "OPTIONS", UriTemplate = "Hello", ResponseFormat = WebMessageFormat.)] 

在哪里设置下列标题

 .header("Access-Control-Allow-Origin", "*") .header("Access-Control-Allow-Headers", "Content-Type") .header("Access-Control-Allow-Methods", "POST, OPTIONS") 

如果你使用这个:

 contentType: "application/json" 

AJAX不会发送GET或POST params到服务器….不知道为什么。

我花了几个小时才知道今天。

只是使用:

 $.ajax( { url : 'http://blabla.com/wsGetReport.php', data : myFormData, type : 'POST', dataType : 'json', // contentType: "application/json", success : function(wsQuery) { } } )