在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Java/ 使用Feign用GET方法時(shí)RequestBody問題,以及關(guān)于HTTP的疑問

使用Feign用GET方法時(shí)RequestBody問題,以及關(guān)于HTTP的疑問

最近對(duì)單體項(xiàng)目進(jìn)行服務(wù)化改造,使用feign作為聲明式http接口客戶端工具,但在使用GET方式時(shí)有些疑問:

客戶端代碼:

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

服務(wù)端代碼

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

feign分別嘗試了Java原生URLConnection,OkHttp,ApacheHttpClient三種方式:

1.URLConnection
報(bào)405錯(cuò)誤,說明http方法不對(duì),但是feign配置是GET方法,查feign的日志也是用的GET方法。后來發(fā)現(xiàn)原因是URLConnection在的原因:對(duì)于有request body的GET方法,自動(dòng)改為POST方法了。

2.OkHttp
直接報(bào)錯(cuò):method GET must not have a request body.

3.ApacheHttpClient完美支持。

問題來了:從HTTP協(xié)議本身,沒有要求GET方法一定要用url這樣的傳參方式,也可以用request body的。

  1. 為什么html的form表單默認(rèn)將Get方法的參數(shù)請(qǐng)到url,而不是requety body?

  2. 為什么URLConnection將有request body的GET請(qǐng)求轉(zhuǎn)為POST?

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

另外為了rest風(fēng)格,所有查詢接口都是GET的,用ApacheHttpClient也是可以的。目前還沒有迭代到生產(chǎn)環(huán)境,這樣做不知道會(huì)不會(huì)有問題。

求教各位,謝謝!

回答
編輯回答
青檸

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

再幫你總結(jié)一下。
大部分人都是不推薦這樣用的,因?yàn)閔ttp1.1規(guī)范中說服務(wù)器在處理GET請(qǐng)求時(shí),不需要檢查Request-URI和Host頭字段以外的任何其他東西。

總之,HTTP規(guī)范并不妨礙你使用GET發(fā)送消息體,但是并不一定所有服務(wù)器都支持這樣寫。

然而有人發(fā)現(xiàn)了大名鼎鼎的elasticsearch是支持Get方法攜帶請(qǐng)求體的,當(dāng)然post方法也是可以的,因?yàn)樗麄冇X得在查詢數(shù)據(jù)時(shí),GET在語義上比POST更正確。
地址如下。
elasticsearch

所以你應(yīng)該知道你這三個(gè)問題的答案了吧。http1.1協(xié)議不建議這樣做,但服務(wù)端支持的話也是可以處理的。

2018年4月10日 00:27
編輯回答
離人歸

規(guī)范就是這么定義的,沒有什么為什么,第三方庫只是按照規(guī)范的方式去處理

2017年4月9日 13:27
編輯回答
浪蕩不羈

謝謝@范閑 的回答,從語義的角度我們的查詢接口都用了GET方法,我們的服務(wù)器環(huán)境也是支持的。

2017年11月4日 16:38