最近對單體項目進行服務化改造,使用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方法。后來發(fā)現(xiàn)原因是URLConnection在的原因:對于有request body的GET方法,自動改為POST方法了。
2.OkHttp直接報錯:method GET must not have a request body.
3.ApacheHttpClient完美支持。
問題來了:從HTTP協(xié)議本身,沒有要求GET方法一定要用url這樣的傳參方式,也可以用request body的。
為什么html的form表單默認將Get方法的參數(shù)請到url,而不是requety body?
為什么URLConnection將有request body的GET請求轉為POST?
為什么OkHttp不支持Get方法有request body?
另外為了rest風格,所有查詢接口都是GET的,用ApacheHttpClient也是可以的。目前還沒有迭代到生產(chǎn)環(huán)境,這樣做不知道會不會有問題。
求教各位,謝謝!
添加回答
舉報
0/150
提交
取消