content-type 为 “application/x-www-form-urlencoded”
首先对于get请求,参数会被urlencoded编码后 追加到 请求url后;
对于post来说,按规范来讲,参数会被urlencoded编码后应当放入请求body中;当然,追加在请求url后,也是可以的。
如果我们请求参数封装成了一个实体情况下(没有封装的情况,只是不牵扯@RequestBody的问题,其他问题是一样的),如下
@PostMapping(value = "create") public WebApiResult createCourse(CreateCourseDTO reqData) { // 入参合法性校验(课程名称是否超出字数限制) if (!StrVerifyUtil.verifyCourseName(reqData.getCourseName())) { return WebApiResult.error(WebApiResultCodeEnum.COURSE_NAME_ILLEGAL); } // 创建课程服务 return courseService.createCourse(reqData); }
没有标明@RequestBody 则接口 默认content-type 不会为“application/json”。则无论调用接口时,参数时放在url中,还是body中,无论content-type是“form-data”还是“x-www-form-urlencoded”都是可以解析取到参数的。
对于集成swagger的情况下,当我们没有通过@ApiImplicitParam 注解中 paramType 属性去指定参数类型时,默认值为“query”
即通过swagger调用时,它会将参数拼接到url后。如下图所示:
显然这里我们希望将参数放入body中,所以我们需要指定@ApiImplicitParam 注解中 paramType属性为“form”。这样通过swagger调用时,他就会将参数放入body中。
总结:对于实体参数上没有@RequestBody ,没有MultpartFile的情况下,没有指定@ApiImplicitParam paramType的话 ,swagger调用的接口content-type 默认是 “application/json”,swagger认为参数是一个实体,所以他以为是一个json请求,如果请求参数没有封装实体,那么会是“application/x-www-form-urlencoded”,同时参数会被拼接在url后。如果指定了paramType为form,则参数会放body中,同时content-type为“application/x-www-form-urlencoded”。
如果用了@RequestBody 注解,则会发现swagger 默认参数paramType 为 body
发表评论