我注意到,在jquery中使用$.post()时,默认的内容类型是application/x-www-form-urlencoded -当我的asp.net mvc代码需要有contentType=application/json

(请参阅这个问题,为什么我必须使用application/json: ASPNET MVC -为什么是ModelState。当该字段有值时,该x字段是必需的?)

我怎么能让$.post()发送contentType=应用程序/json?我已经有了大量的$.post()函数,所以我不想更改为$.ajax(),因为这会花费太多时间

如果我尝试

$.post(url, data, function(), "json") 

它仍然有contentType=application/x-www-form-urlencoded。那么,如果“json”参数没有将内容类型更改为json,它究竟做了什么呢?

如果我尝试

$.ajaxSetup({
  contentType: "application/json; charset=utf-8"
});

这是可行的,但影响到每一美元。Get和$。帖子,我有和导致一些打破。

那么是否有一些方法,我可以改变$.post()的行为发送contentType=application/json?


当前回答

出于某种原因,在ajax请求上设置@Adrien建议的内容类型在我的情况下不起作用。但是,您实际上可以使用$更改内容类型。在发布之前这样做:

$.ajaxSetup({
    'beforeSend' : function(xhr) {
        xhr.overrideMimeType('application/json; charset=utf-8');
    },
});

然后赚你的美元。post调用:

$.post(url, data, function(), "json")

我有jQuery + IIS的问题,这是唯一的解决方案,帮助jQuery理解使用windows-1252编码ajax请求。

其他回答

美元。如果你有CORS(跨源资源共享)问题,post将无法工作。尝试使用$。Ajax的以下格式:

$.ajax({
        url: someurl,
        contentType: 'application/json',
        data: requestInJSONFormat,
        headers: { 'Access-Control-Allow-Origin': '*' },
        dataType: 'json',
        type: 'POST',
        async: false,
        success: function (Data) {...}
});
$.ajax({
  url:url,
  type:"POST",
  data:data,
  contentType:"application/json; charset=utf-8",
  dataType:"json",
  success: function(){
    ...
  }
})

参见:jQuery.ajax()

可以作为最后一个参数传递给post()的“json”数据类型表示函数在服务器响应中期望的数据类型,而不是它在请求中发送的数据类型。具体来说,它设置了“Accept”报头。

老实说,最好的办法是切换到ajax()调用。post()函数是为了方便;ajax()的简化版本,当您只是做一个简单的表单发布时调用。你不是。

如果真的不想切换,可以创建自己的函数,比如xpost(),并使用内容类型设置将给定的参数转换为jQuery ajax()调用的参数。这样,就不必将所有这些post()函数重写为ajax()函数,只需将它们全部从post更改为xpost(或其他)。

这个简单的jquery API扩展(来自:https://benjamin-schweizer.de/jquerypostjson.html)为$. postjson()做的伎俩。您可以像使用其他原生jquery Ajax调用一样使用postJSON()。您可以附加事件处理程序等等。

$.postJSON = function(url, data, callback) {
  return jQuery.ajax({
    'type': 'POST',
    'url': url,
    'contentType': 'application/json; charset=utf-8',
    'data': JSON.stringify(data),
    'dataType': 'json',
    'success': callback
  });
};

像其他Ajax api(如AngularJS中的$http)一样,它将正确的contentType设置为application/json。 你可以直接传递json数据(javascript对象),因为它在这里被字符串化了。 预期返回的数据类型被设置为JSON。 你可以为承诺附加jquery的默认事件处理程序,例如:

$.postJSON(apiURL, jsonData)
 .fail(function(res) {
   console.error(res.responseText);
 })
 .always(function() {
   console.log("FINISHED ajax post, hide the loading throbber");
 });

我想你可能不得不这么做

1.将源代码修改为$。post总是使用JSON数据类型,因为它实际上只是一个预配置的$的快捷方式。ajax调用

Or

2.定义您自己的实用函数,它是$。您想使用的Ajax配置

Or

3.你可以覆盖$。通过monkey补丁,发布你自己的实现功能。

示例中的JSON数据类型是指从服务器返回的数据类型,而不是发送到服务器的格式。