Spring Boot如何让GET接口允许接收任意Content-Type请求头?
Spring Boot如何让GET接口允许接收任意Content-Type请求头?
嘿,这个问题我之前踩过坑!先给你理清楚报错原因:你用的是GET接口,但客户端发了multipart/form-data的请求头——按HTTP规范来说,GET请求本来就不该带请求体,而multipart/form-data是用来上传文件的,通常和POST搭配。Tomcat会自动尝试解析这类请求,但GET请求没有请求体,自然找不到multipart请求必需的boundary,就抛出那个错误了。
下面给你两种可行的解决办法,按需选择:
方法一:直接指定接口接受任意Content-Type
修改你的Controller方法,通过consumes属性明确指定接受所有类型的Content-Type,因为是GET请求我们不需要处理multipart内容,直接写业务逻辑即可:
import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class YourController { @GetMapping(value = "/logic", consumes = MediaType.ALL_VALUE) public ResponseEntity<HttpStatus> appLogic() { // 你的业务逻辑 return ResponseEntity.ok(HttpStatus.OK); } }
如果这种方式还是触发Tomcat的multipart解析检查,那就试试第二种方法。
方法二:自定义解析器跳过特定请求的multipart检查
我们可以写一个自定义的Multipart解析器,让它对GET请求的/logic接口跳过multipart解析,这样就不会触发boundary检查了:
import org.springframework.web.multipart.commons.CommonsMultipartResolver; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Component; @Component public class CustomMultipartResolver extends CommonsMultipartResolver { @Override public boolean isMultipart(HttpServletRequest request) { // 判断请求方法是GET且路径是/logic时,不认为是multipart请求 if ("GET".equalsIgnoreCase(request.getMethod()) && "/logic".equals(request.getRequestURI())) { return false; } return super.isMultipart(request); } }
最后提一句:其实从REST设计规范来讲,GET请求携带请求体(包括multipart类型)是不符合规范的,最好能让客户端调整请求方式或者Content-Type。但如果必须兼容这种场景,上面的方法就能解决问题啦。
备注:内容来源于stack exchange,提问作者TomJava
相关产品推荐
相关产品推荐

