Retrofit2.0+網路框架HTTP實戰
上文介紹了搭建本地服務端,Android客戶端是進行普通的HTTP請求,今天我基於此servlet,繼續介紹一種新的網路請求方式,就是目前比較流行的一種框架:Retrofit。Retrofit是一款面向Android和Java的型別安全的HTTP客戶端框架,簡單方便。可以通過註解的方式,申明請求的方式和引數。它很強大,支援GET, POST, PUT, DELETE, and HEAD.等請求。
一,Retrofit的特點
1,支援URL引數的替換和請求引數查詢
2,Object型別轉換為請求體,如JSON,buffers
3,支援Multipart,大檔案上傳。
下面舉例來介紹。
二,服務端搭建,提供訪問的介面
上文我已經搭建來一個簡單的servlet介面,客戶端訪問時傳username引數,server會返回json字串。詳情請看:
搭建本地server,響應Android客戶端HTTP請求
三,使用傳統的HTTP請求方式訪問介面
之前我們通常會使用第三方框架,比如使用OKHTTP,我另外有介紹: Android網路請求:OkHttp實戰
或者像我這樣自己封裝請求:
//測試本地servlet介面,可以get,也可以post
public static void testMyServlet(){
String baseUrl="http://192.168.1.103:8080/Android/";
String url = baseUrl+"servlet/LoginServlet";
String url2 = baseUrl+"servlet/LoginServlet?username=duqian223";
//OairHttpHelper.sendPost(OairHttpHelper.Method_Get, url2, null, new OairHttpHelper.OairHttpListener() {
OairHttpHelper.sendPost("POST", url, "username=dusan2016&age=25", new OairHttpHelper.OairHttpListener() {
@Override
public void onSuccess(String result) {
LogUtils.debug(TAG,"MyServlet result="+result);
}
@Override
public void onFailure(Exception e) { LogUtils.debug(TAG,"error="+e.toString());
}
});
}
封裝的內部實現不用說了吧,就是HTTPURLConnection請求。返回結果一個簡單的json:
{"username":"dusan2016"}
三,使用Retrofit進行HTTP請求
1,首先,定義API服務介面
註解的形式宣告GET和POST請求,login是方法名,後面不帶引數的為GET請求,引數寫在URL中,有引數的寫在方法裡面,通過Query形式。Call是範型,返回請求後得到的javaBean物件,本文為TestBean,程式碼如下:
/**
* 封裝json為TestBean
* Created by duqian on 16/5/3.
*/
public class TestBean {
public String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "TestBean{" +
"username='" + username + '\'' +
'}';
}
}
使用Retrofit進行HTTP請求的定義
/**
* retrofit for HTTP
* Created by duqian on 16/5/3.
*/
public interface OairApiService {
@POST("servlet/LoginServlet")
Call<TestBean> login(@Query("username") String username);
@GET("servlet/LoginServlet?name=duqian2016")
Call<TestBean> login();
}
2,實現API服務介面OairApiService
public static void testRetrofit() {
baseUrl = "http://192.168.1.103:8080/Android/";//根URL
//建立Retrofit例項,實現OairApiService介面
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl) .addConverterFactory(GsonConverterFactory.create())
.build();
OairApiService oairAPIService = retrofit.create(OairApiService.class);
//傳送Post請求,不帶引數為GET請求
final Call<TestBean> call = oairAPIService.login("Dusan2016");
call.enqueue(new Callback<TestBean>() {
@Override
public void onResponse(Call<TestBean> call, Response<TestBean> response) {
String result = response.body().toString();
LogUtils.debug(TAG,"result="+result);
}
@Override
public void onFailure(Call<TestBean> call, Throwable t) {
LogUtils.debug(TAG,"error "+t.toString());
}
});
}
測試通過,返回結果如下:
result=TestBean{username='Dusan2016'}
3,Android studio依賴
//android studio開發,請新增最新的retrofit,本例通過Gson解析json,新增對應的依賴:
compile 'com.squareup.retrofit2:retrofit:2.0.2'
compile 'com.squareup.retrofit2:converter-gson:2.0.2'
四,retrofit其他請求方式
官方提供了很多請求方式的說明。get請求,可以在URL中修改引數,在實際請求的時候,傳入引數動態修改URL。
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
另外,還可以新增查詢的引數
//簡單的引數
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @Query("sort") String sort);
//複雜的引數寫法,用map集合
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
表單提交是常見的請求方式,宣告為form表單提交,可以這樣寫:
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
檔案上傳同樣支援,通過註解的方式,新增請求體和表述文字:
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
如果要新增請求頭,我們可以用註解的方式@Headers:
@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();
//或者這樣動態的新增Header
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)
五,總結
本文只是以一個簡單的demo為例,介紹了retrofit的基本使用,並解釋了官方的一些用法。是不是瞬間覺得,簡單大氣上檔次。其實,真實專案中使用,會發現它的確很強大,很多實用的功能,內部實現原理也很有意思。
未完待續,杜乾,Dusan,Q 291902259,歡迎交流。
相關文章
- Android Http請求框架二:xUtils 框架網路請求AndroidHTTP框架
- 面試 -- 網路 HTTP面試HTTP
- 神經網路:numpy實現神經網路框架神經網路框架
- 網路管理實戰寶典
- 網路爬蟲(六):實戰爬蟲
- 精通 Python 網路爬蟲:核心技術、框架與專案實戰Python爬蟲框架
- Kotlin實戰--Retrofit網路模型Kotlin模型
- Python網路爬蟲實戰Python爬蟲
- [計算機網路]HTTP 1.0/HTTP 1.1/HTTP 2.0計算機網路HTTP
- 網路通訊3:HTTP實現文字傳輸HTTP
- http 框架的路由實現原理HTTP框架路由
- 網路爬蟲——爬蟲實戰(一)爬蟲
- 社交網路50條:微博實戰經
- HTTP網路請求原理HTTP
- 課程 2: HTTP 網路HTTP
- HTTP快取協議實戰HTTP快取協議
- 工業物聯網網路的實施戰略
- 實戰生成對抗網路[1]:簡介
- 用原生http 實現簡單 Express 框架HTTPExpress框架
- 網路安全含金量有多高?老男孩網路安全實戰學習時間
- 網路協議 - TCP/IP、HTTP、HTTPS、HTTP2.0協議TCPHTTP
- 《網路爬蟲開發實戰案例》筆記爬蟲筆記
- 乾貨分享!Python網路爬蟲實戰Python爬蟲
- Python網路爬蟲實戰小專案Python爬蟲
- Python 3網路爬蟲開發實戰Python爬蟲
- Python網路爬蟲實戰專案大全!Python爬蟲
- python網路爬蟲實戰--重點整理Python爬蟲
- 網路通訊4:HTTP實現二進位制傳輸HTTP
- python實戰--Http代理伺服器PythonHTTP伺服器
- Http網路協議包 (快速理解)HTTP協議
- 網路分層TCP/IP 與HTTPTCPHTTP
- Airtest (poco 框架) 元素定位實戰AI框架
- swoole 框架 swoft2.0 實戰框架
- Solidity的Truffle框架實戰Solid框架
- iOS-TCP網路框架iOSTCP框架
- golang 網路框架之 thriftGolang框架
- 網路框架分析 – 全是套路框架
- Retrofit網路框架介紹框架