formData = new FormData();
formData.append('field1', "value1");
formData.append('field2', "value2");
$.ajax({
type: "put",
url:"urldsf",
data:formData,
processData:false,
contentType:false,
success: result=> {
},
error:function () {
}
}
上述代码在后代接收不到参数,代码调试俩个小时候发现了问题(在家是最新的一点问题都没,公司不是最新的,汗!!)。。。
在org.apache.catalina.connector.Request类中
parseParameters方法
protected void parseParameters() {//代码未贴全,只贴了关键部分
parametersParsed = true;
Parameters parameters = coyoteRequest.getParameters();
boolean success = false;
try {
// Set this every time in case limit has been changed via JMX
parameters.setLimit(getConnector().getMaxParameterCount());
// getCharacterEncoding() may have been overridden to search for
// hidden form field containing request encoding
Charset charset = getCharset();
boolean useBodyEncodingForURI = connector.getUseBodyEncodingForURI();
parameters.setCharset(charset);
if (useBodyEncodingForURI) {
parameters.setQueryStringCharset(charset);
}
// Note: If !useBodyEncodingForURI, the query string encoding is
// that set towards the start of CoyoyeAdapter.service()
parameters.handleQueryParameters();
if (usingInputStream || usingReader) {
success = true;
return;
}
if( !getConnector().isParseBodyMethod(getMethod()) ) {
//这句代码导致http put不会进行multipart/form-data解析(具体为什么,可自行
//调试,很简单的)。在最新的springboot 2.0.5及以后将这句代码挪到了
//if("multipart/form- data".equals(contentType)) 这个之后,就能正常的
//接收数据了。
success = true;
return;
}
String contentType = getContentType();
if (contentType == null) {
contentType = "";
}
int semicolon = contentType.indexOf(';');
if (semicolon >= 0) {
contentType = contentType.substring(0, semicolon).trim();
} else {
contentType = contentType.trim();
}
if ("multipart/form-data".equals(contentType)) {
parseParts(false);
success = true;
return;
}
}
}
最简单的方法是讲springboot升级到2.0.5及以上版本。
若2.0.4及以前版本若想解决此问题,我个人的想法是修改org.apache.catalina.connector.Connector的parseBodyMethods变量或者修改springboot的内嵌tomcat版本(tomcat版本修改8.5.34及以后的版本),或者使用外部tomcat,具体什么版本,请自行查找
还有一种方法;参考了https://blog.csdn.net/asd1098626303/article/details/60868316?utm_source=blogxgwz7。
前台改为
$.ajax({
type: "put",
url:"urldsf",
data:{
'field1':"value1",
'field2':"value2"
},
contentType:"application/x-www-form-urlencoded",
success: result=> {
},
error:function () {
}
}
也就是不使用formData这种格式,但是无法解决上传文件这种问题(当然可以通过文件转base64码解决(猜想的,未实践))