H5W3
当前位置:H5W3 > 其他技术问题 > 正文

使用Feign用GET方法时RequestBody问题,以及关于HTTP的疑问

最近对单体项目进行服务化改造,使用feign作为声明式http接口客户端工具,但在使用GET方式时有些疑问:

客户端代码:

@RequestLine("GET /users")
public List<User> list(UserDto user);

服务端代码

@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<User> list(@RequestBody User user) {
    return userService.getList(user);
}

feign分别尝试了Java原生URLConnection,OkHttp,ApacheHttpClient三种方式:

1.URLConnection
报405错误,说明http方法不对,但是feign配置是GET方法,查feign的日志也是用的GET方法。后来发现原因是URLConnection在的原因:对于有request body的GET方法,自动改为POST方法了。

2.OkHttp
直接报错:method GET must not have a request body.

3.ApacheHttpClient完美支持。

问题来了:从HTTP协议本身,没有要求GET方法一定要用url这样的传参方式,也可以用request body的。

  1. 为什么html的form表单默认将Get方法的参数请到url,而不是requety body?

  2. 为什么URLConnection将有request body的GET请求转为POST?

  3. 为什么OkHttp不支持Get方法有request body?

另外为了rest风格,所有查询接口都是GET的,用ApacheHttpClient也是可以的。目前还没有迭代到生产环境,这样做不知道会不会有问题。

求教各位,谢谢!

回答:

帮你搜索了一下。
https://stackoverflow.com/que…

再帮你总结一下。
大部分人都是不推荐这样用的,因为http1.1规范中说服务器在处理GET请求时,不需要检查Request-URI和Host头字段以外的任何其他东西。

总之,HTTP规范并不妨碍你使用GET发送消息体,但是并不一定所有服务器都支持这样写。

然而有人发现了大名鼎鼎的elasticsearch是支持Get方法携带请求体的,当然post方法也是可以的,因为他们觉得在查询数据时,GET在语义上比POST更正确。
地址如下。
elasticsearch

所以你应该知道你这三个问题的答案了吧。http1.1协议不建议这样做,但服务端支持的话也是可以处理的。

回答:

规范就是这么定义的,没有什么为什么,第三方库只是按照规范的方式去处理

回答:

谢谢@范闲 的回答,从语义的角度我们的查询接口都用了GET方法,我们的服务器环境也是支持的。

本文地址:H5W3 » 使用Feign用GET方法时RequestBody问题,以及关于HTTP的疑问

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址