阿毛
It's me !
想你所想
Swagger之http content-type 实践

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”

https://file.blog.humh.cn/2020/06/ad1a1b7183951dc89f508a6b6c422144.png

即通过swagger调用时,它会将参数拼接到url后。如下图所示:

https://file.blog.humh.cn/2020/06/ad1a1b7183951dc89f508a6b6c422144-1.png

显然这里我们希望将参数放入body中,所以我们需要指定@ApiImplicitParam 注解中 paramType属性为“form”。这样通过swagger调用时,他就会将参数放入body中。

https://file.blog.humh.cn/2020/06/ad1a1b7183951dc89f508a6b6c422144-2.png
https://file.blog.humh.cn/2020/06/ad1a1b7183951dc89f508a6b6c422144-3.png

总结:对于实体参数上没有@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

https://file.blog.humh.cn/2020/06/ad1a1b7183951dc89f508a6b6c422144-4.png

发表评论

textsms
account_circle
email

想你所想

Swagger之http content-type 实践
content-type 为 “application/x-www-form-urlencoded” 首先对于get请求,参数会被urlencoded编码后 追加到 请求url后; 对于post来说,按规范来讲,参数会被urlencoded编码后应当…
扫描二维码继续阅读
2020-06-08