1. 程式人生 > >Android retrofit 註解@QueryMap和@Body的區別

Android retrofit 註解@QueryMap和@Body的區別

使用retrofit這樣框架快一年了,以前使用它傳遞引數時都是用@QueryMap註解傳遞,雖然知道這樣不是很好,但是當時換框架的時候看到工作量太大就沒有換成實體類形式了,之前的使用方式如下圖:




由於最近在研究java後臺,搭建了一個SSM框架想測試一下;因為之前以為HashMap只能採用這種方式傳遞,在今天的測試中發現並不是,其實使用HashMap同樣可以採用@Body註解,而且@QueryMap跟@Body的區別非常大,先看按之前的方式使用@QueryMap:



上面是android的程式碼,使用了RxJava。在來看java後臺的:

使用HttpServletRequest來接收是沒有問題的,但是如果後臺使用@RequestBody來接收引數就沒法接收到了,而且連請求都沒接收到:

下面我們來看一下,android Studio列印的日誌,發現後臺返回了400,並且發現引數拼接到連線後面了,這不是GET的傳遞引數的方式嗎?但是我明明是POST註解請求:

我點選註解看了下原始碼,看到下面的註釋,第一句的大意就是說:會把key和value拼接到url後面,所以才會出現剛剛日誌中那種情況,而且看註釋都是在講GET請求下的使用,並沒有POST的使用介紹,所以我感覺這個註解是主要為GET請求準備的:


在來看@Body,先看原始碼吧 ,註釋的大體意思是:使用這個註解可以把引數放到請求體中,適用於 POST/PUT請求:

然後再看使用方式,和@QueryMap 一樣的,而且它可以使用實體類,QueryMap 是不能註解實體類的:


在看列印的日誌:
從日誌看出來,這才是POST請求引數引數的方式。 好了!總結一下:@QueryMap註解會把引數拼接到url後面,所以它適用於GET請求;@Body會把引數放到請求體中,所以適用於POST請求。
如果你的專案是採用POST請求方式,不管是使用實體類還是使用HashMap最好採用@Body註解。雖然你使用QueryMap 可能也不會有什麼問題(PS:這種共用的情況只適用於POST請求,GET請求不能使用@Body註解,否則會報錯),就像樓主之前一樣,一直都是採用QueryMap - _ - ,這裡要心疼後臺三秒鐘!哈哈!!!!