Retrofit2.0 的初步使用,Retrofit2.0使用

來源:互聯網
上載者:User

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(),"添加成功");

 

第一次把這幾天弄出來的東西跟大家一起分享,希望能一起討論--

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.