Retrofit2.0 的初步使用,Retrofit2.0使用
Retrofit2.0 的初步使用
首先我就不介紹了,直接說下怎麼使用,本身我也是剛剛因為要仿照微軟的azure-sdk-for-java(git地址是:https://github.com/Azure/azure-sdk-for-java.git)
然後去編寫一個類似的程序裡面就設計到了Retrofit。
我也是剛剛才使用所以說叫我講啥原理我肯定不怎麼會講,所以這裡就是告訴大家怎麼使用,裡面可能有些代碼不怎麼好,希望大家一起指出來,我會慢慢改正,請大家見諒。
首先我是把Retrofit跟OkHttpClient
一起封裝在RestCline中,當然也可以單獨使用Retrofit,用法都是一樣的,這裡面因為加入了Gosn轉化器,所以需要添加Gson依賴包,
我這個版本是可以用的之前好像用的是Gson2.4的版本,然後在使用的時候一直報沒找到Gson包中的JsonWrite這個類的錯誤,好像是這個 。
Maven

![]()
1 <!-- https://mvnrepository.com/artifact/com.squareup.retrofit2/converter-gson -->
2 <dependency>
3 <groupId>com.squareup.retrofit2</groupId>
4 <artifactId>converter-gson</artifactId>
5 <version>2.0.1</version>
6 </dependency>
7 <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
8 <dependency>
9 <groupId>com.google.code.gson</groupId>
10 <artifactId>gson</artifactId>
11 <version>2.6.1</version>
12 </dependency>
View Code
1 public RestClient build() {
2 OkHttpClient httpClient = httpClientBuilder
3 .build();
4 return new RestClient(httpClient,
5 retrofitBuilder
6 .baseUrl(baseUrl)//設置URL
7 .addConverterFactory(GsonConverterFactory.create())//添加Gosn轉換器
8 .client(httpClient)
9 .build()
10 );
11 }
接下來的就是創建一個接口,我這裡寫了增刪改查,跟提交方式為GET,POST,PUT,DELETE的四種方法。
1 @Headers("Content-Type: application/json; charset=utf-8")
2 @GET("{apiVersion}/saibongs/items/")
3 Call<Result> search(@Path("apiVersion") String apiVersion,@Query("number")Integer number);
@GET這裡面有@Query,跟@QueryMap它會把參數以?number=3&….這種方式連接在url上面
@Path的作用就是:
{apiVersion}/uses/items/ 比如apiVersion=v1,那麼它的訪問路徑就是v1/uses/items

![]()
1 interface Service {
2 /**
3 * 新增一條倉庫定義記錄**/
4 @Headers("Content-Type: application/json; charset=utf-8")
5 @POST("{apiVersion}/stores/items/")
6 Call<ResponseBody> addStore(@Path("apiVersion") String apiVersion,@Body StoreInfo storeInfo);
7 /**
8 * 根據map中的參數查詢滿足條件的倉庫定義記錄列表**/
9 @Headers("Content-Type: application/json; charset=utf-8")
10 @POST("{apiVersion}/stores/list/")
11 Call<ResponseBody> getStoreList(@Path("apiVersion") String apiVersion,@Body StoreInfo storeInfo);
12 /**
13 * 修改倉庫定義記錄*/
14 @Headers("Content-Type: application/json; charset=utf-8")
15 @PUT("{apiVersion}/stores/items/{code}")
16 Call<ResponseBody> editStore(@Path("apiVersion") String apiVersion,@Path("code") String code,@Body StoreInfo storeInfo);
17 /**
18 * 刪除倉庫定義記錄*/
19 @Headers("Content-Type: application/json; charset=utf-8")
20 @DELETE("{apiVersion}/stores/items/{code}")
21 Call<ResponseBody> deleteStore(@Path("apiVersion") String apiVersion,@Path("code") String code);
22 }
View Code
@POST裡面的 @Body 是綁定一個對象
至於網上說的根據表單提交方式的不同
表單提交類型為@FormUrlEncoded跟它對應的就是@Field和@FieldMap,(表單默認提交為FormUrlEncoded)
表單提交類型為@Multipart的跟它對應的是@Part跟@PartMap
比如我這裡面的那個根據map查詢的那個方法,我直接就是把參數封裝成對象然後用@Body可以正常訪問,而用上面的那兩種我都試了下都不行,至於是什麼原因我也不是很清楚。
在使用之前你要create一下
retrofit.create(StoreInfoService.class);
}
然後再進行調用上面的方法

![]()
1 /**
2 * 查詢服務目錄記錄**/
3 public List<StoreInfo> getStoreList(Catalogue catalogue, Retrofit retrofit) throws IOException, IllegalArgumentException {
4 Call<ResponseBody> call = service.getStoreList(this.client.apiVersion(), catalogue);
5 List<StoreInfo> list=new ArrayList<StoreInfo>();
6 Response<ResponseBody> bodyResponse = call.execute();
7 if(bodyResponse.errorBody()!=null){
8 Converter<ResponseBody, ErrorMsg> errorConverter =
9 retrofit.responseBodyConverter(ErrorMsg.class, new Annotation[0]);
10 // 錯誤類型
11 ErrorMsg error = errorConverter.convert(bodyResponse.errorBody());
12 if(error!=null){
13 error.setStatus(bodyResponse.code()+"");
14 throw new DataCenterException(error);
15 }
16 }else{
17 Gson gson=new Gson();
18 DatacenterResult datacenterResult= gson.fromJson(bodyResponse.body().string(), new TypeToken<DatacenterResult>() {
19 }.getType()) ;
20 PageUtil pa= datacenterResult.getPageUtil();
21 list=pa.getList();
22 }
23 return list;
24 }
View Code
bodyResponse.body().string()這裡面存放的就是你的結果數據,我是用Gson把它轉化成了一個對象
當然還可以直接定義那個類型的對象它可以自己轉化

![]()
//查詢服務
@Headers("Content-Type: application/json; charset=utf-8")
@POST("{apiVersion}/saibongs/")
Call<SaibongResult> searchSaibong(@Path("apiVersion") String apiVersion,@Body SaibongSearch sa) ;
public List<SaibongRules> searchSaibong(SaibongSearch saibong, Retrofit retrofit) throws IOException, IllegalArgumentException {
Call<SaibongResult> call = service.searchSaibong("v1", saibong);
List<SaibongRules> list=new ArrayList<SaibongRules>();
Response<SaibongResult> bodyResponse = call.execute();
//這裡面系統手動拋出的異常,自己定義的異常類型
if(bodyResponse.errorBody()!=null){
Converter<ResponseBody, ErrorMsg> errorConverter = retrofit.responseBodyConverter(ErrorMsg.class, new Annotation[0]);
// 錯誤類型ErrorMsg 是我自己定義的
ErrorMsg error = errorConverter.convert(bodyResponse.errorBody());
if(error!=null){
error.setStatus(bodyResponse.code()+"");
throw new SaibongException(error);
}
}else{
SaibongResult saibongResult= bodyResponse.body();
PageUtil pa= saibongResult.getPageUtil();
list=pa.getList();
}
return list;
}
View Code
測試
這裡測試需要創建一個本地的服務,所以需要添加mockwebserver的jar包
Maven
1 <dependency>
2 <groupId>com.squareup.okhttp3</groupId>
3 <artifactId>mockwebserver</artifactId>
4 <version>3.3.1</version>
5 </dependency>
創建一個本地的服務
1 MockWebServer server = new MockWebServer(); //創建本地服務
2 server.start();//開啟服務
3 //創建連接對象
4 retrofit = new Retrofit.Builder()
5 .baseUrl(server.url("/"))
6 .addConverterFactory(GsonConverterFactory.create())
7 .build();
8 server.enqueue(new MockResponse()
9 .setResponseCode(404)//這裡設置你的http狀態碼
10 .setBody("這裡設置的是你的結果"));
11 Service service = retrofit.create(Service.class);
12 //調用方法
13 server.add();
14 //這裡可以用junit中的來比對結果
15 assertEquals(server.add(),"添加成功");
第一次把這幾天弄出來的東西跟大家一起分享,希望能一起討論--