使用httpClient调用后台post接口返回400 Bad Request

Blade 未结 2 6593

后台日志

2019-06-13 11:28:28.414  WARN 53716 --- [ XNIO-1 task-15] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing: public org.springblade.core.tool.api.R org.springblade.admin.controller.TestController.test(org.springblade.admin.controller.TestVO)]

后台controller

@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping(value="/front/test",produces = "application/json;charset=utf-8")
@Api(value = "前端接口", tags = "前端接口")
public class TestController {


   @PostMapping("/testPost")
   @ResponseBody
   public R test(@RequestBody TestVO test){
      return R.data(test);
   }

}



前端ajax调用没问题,Android端 使用httpClient 和OkHttp调用都是返回400 Bad Request

2条回答
  • 2019-06-13 18:32

    经过一下午的跟踪代码,调试发现

    org.springblade.core.tool.support.xss.XssHttpServletRequestWrapper类中的getInputStream()方法


    if (!super.getHeader("Content-Type").equalsIgnoreCase("application/json") && !super.getHeader("Content-Type").equalsIgnoreCase("application/json;charset=UTF-8")){

    return super.getInputStream();

    }


    由于 okHttp中默认的Content-Type是"application/json;空格charset=UTF-8"中间有空格  导致走这里的分支 获取不到请求参数报错


    1 讨论(0)
  • 2019-06-13 13:06


    错误已经很明显了:Required request body is missing


    请求格式不对,要设置成json,并且传json字符串


    随手百度了篇博文供参考:https://my.oschina.net/u/3434392/blog/1826264



    作者追问:2019-06-13 15:57

    请求方式是对的,使用的是post+json请求的,经过多次测试,调用的时候必须在httpClient的请求头中设置Content-type才行

    post.setHeader("Content-type", "application/json");

    但是设置

    post.setHeader("Content-type", "application/json;charset=UTF-8");

    依然报错 400   Bad Request


    application/json 和 application/json;charset=UTF-8 区别是啥?  这个是SpringMVC做的控制吗?

    0 讨论(0)
提交回复