ASP.NET Core POST接口通过jQuery调用时DTO接收为null,但Postman调用正常
ASP.NET Core POST接口通过jQuery调用时DTO接收为null,但Postman调用正常
我之前也碰到过几乎一模一样的问题!大概率是你的jQuery ajax请求漏了关键配置processData: false,这可是用jQuery发送预序列化JSON字符串时的经典坑。
问题根源
默认情况下,jQuery的$.ajax会把data参数当成待序列化的对象处理——哪怕你已经把数据转成了JSON字符串。它会自动对数据做URL编码,导致实际发往后端的请求体根本不是你预期的纯JSON,而是被编码后的乱码内容。ASP.NET Core的JSON解析器完全认不出这种内容,自然就把DTO的所有属性都设为null了。
你看你的ajaxCall实现里确实没加这个配置,这就是问题的核心!
修复方案
只需要在$.ajax的配置里加上processData: false就行,修改后的代码如下:
public ajaxCall(endpoint: string, method: HttpMethods, content: any, callbacks: Array<Function>, contentType) { var self = this; $.ajax({ method: HttpMethods[method], url: this._contextPath + endpoint, contentType: contentType === ContentType.ApplicationFormUrlEncoded ? "application/x-www-form-urlencoded; charset=UTF-8" : "application/json; charset=utf-8", data: content, processData: false, // 新增这一行,禁止jQuery自动处理请求数据 }) .done(function (apiResponse, textStatus, jqXHR) { if(!apiResponse.success && apiResponse.metadata && apiResponse.metadata.errorId){ self._errorObserver.errorReceived(apiResponse.metadata.message+ ":" + apiResponse.metadata.errorId) } else { for (let callback of callbacks) { if (callback) { callback(apiResponse); } } } }) .fail(function (msg) { console.log('ajax call http error: ' + msg.status + ' ' + msg.statusText); if (msg.status === 401) { document.location.href = self._contextPath; } else if (msg.status === 0) { // call aborted (page was changed?) } else { //console.log('ajax communication error: ' + msg.status + ' ' + msg.statusText); } }).always(function () {}); }
验证方法
你可以打开浏览器开发者工具的「网络」标签,对比修改前后的请求体:
- 修改前:请求体里的双引号会变成
%22,整个内容是URL编码后的格式 - 修改后:请求体和你在Postman里发送的JSON完全一致
另外你提到其他POST接口正常,比如/api/book/property/update,大概率是那些接口的请求数据是FormData或普通对象,jQuery自动序列化后后端能正常解析,而这个接口用了预序列化的JSON字符串,才触发了这个问题。
最后再划个重点:用jQuery发送已经JSON.stringify过的字符串时,必须同时满足两个条件:
contentType: "application/json; charset=utf-8"(你已经做到了)processData: false(之前漏掉的关键配置)
内容来源于stack exchange
相关产品推荐
相关产品推荐

