介紹使用注解描述HTTP請求API聲明Url 操作請求body編碼和MultipartRetrofit 配置自定義轉換器
Retrofit是一種封裝好的網絡請求客戶端(android ,java)
Retrofit將HTTP API轉換為Java接口。
public interface GitHubService { @GET("users/{user}/repos") Call<List<Repo>> listRepos(@Path("user") String user);}Retrofit類生成GitHubService接口的實現。
Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.github.com/") .build();GitHubService service = retrofit.create(GitHubService.class);每個call都可以向遠程Web服務器發出同步或異步HTTP請求。
Call<List<Repo>> repos = service.listRepos("octocat");? URL參數替換和查詢參數支持 ?對象轉換為請求正文(例如,JSON,協議緩沖區) ? Multipart請求body和文件上傳
接口方法及其參數的注解指示如何處理請求 請求方法 每個方法必須具有請求方法和相對URL的HTTP注解。有五個內置注解:GET,POST,PUT,DELETE和HEAD。在注解中指定資源的相對URL。
@GET(“users / list”) 您還可以在URL中指定查詢參數。 @GET(“users / list?sort = desc”)動態更新請求URL可以使用替換塊和方法上的參數。替換塊是由{ }圍繞的字母數字字符串。相應的參數必須使用相同的字符串用@Path注解
@GET("group/{id}/users")Call<List<User>> groupList(@Path("id") int groupId);也可以添加查詢參數。
@GET(“group / {id} / users”) 調用<List <User >> groupList(@Path(“id”)int groupId,@Query(“sort”)String sort);對于復雜的查詢參數組合,可以使用Map。
@GET(“group / {id} / users”) 調用<List <User >> groupList(@Path(“id”)int groupId,@QueryMap Map <String,String> options)@Body注解可以指定一個 使用@Body注解,一個對象可以被指定為一個HTTP請求body
@POST(“users / new”) 調用<User> createUser(@Body User user);該對象也將使用Retrofit實例上指定的轉換器進行轉換。 如果沒有添加轉換器,則只能使用RequestBody。
方法上也可以聲明為發送表單編碼和Multipart數據的注解。 當方法上存在@FormUrlEncoded時,將發送表單編碼的數據。每個鍵值對都使用包含名稱的@Field和提供值的對象進行注解。
@FormUrlEncoded@POST("user/edit")Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);當方法上存在@Multipart時,將使用Multipart請求。零件使用@Part注解聲明。
@Multipart@PUT("user/photo")Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);Multipart使用Retrofit的轉換器,或者它們可以實現RequestBody來處理自己的序列化。 HEADER 操作 您可以使用@Headers注解為方法設置靜態頭。
@Headers("Cache-Control: max-age=640000")@GET("widget/list")Call<List<Widget>> widgetList();@Headers({ "Accept: application/vnd.github.v3.full+json", "User-Agent: Retrofit-Sample-App"})@GET("users/{username}")Call<User> getUser(@Path("username") String username);請注意,標頭不會相互覆蓋。具有相同名稱的所有標頭將包含在請求中。 請求頭可以使用@Header注解動態更新。必須向@Header提供相應的參數如果值為null,則將省略標題。否則,toString將被調用的值,并使用其輸出結果。
@GET("user")Call<User> getUser(@Header("Authorization") String authorization)如果每個request都需要添加公共@Header()則使用okHttp中的OkHttp interceptor.進行設置
同步,異步 調用實例可以同步或異步執行。每個實例只能使用一次,但調用clone()將創建一個可以使用的新實例。 在Android上,回調將在主線程上執行。在JVM上,回調將發生在執行HTTP請求的同一線程上
Retrofit是將API接口轉換為可調用對象的類。默認情況下,Retrofit將為您的平臺提供正常默認值,但允許自定義。
轉換器 默認情況下,Retrofit只能將HTTP主體反序列化成OkHttp的ResponseBody類型,并且它只能接受@Body的RequestBody類型。 可以添加轉換器以支持其他類型。六個同級模塊適應流行的序列化庫,為您提供方便。
Gson: com.squareup.retrofit2:converter-gsonJackson: com.squareup.retrofit2:converter-jacksonMoshi: com.squareup.retrofit2:converter-moshiPRotobuf: com.squareup.retrofit2:converter-protobufWire: com.squareup.retrofit2:converter-wireSimple xml: com.squareup.retrofit2:converter-simplexmlScalars (primitives, boxed, and String): com.squareup.retrofit2:converter-scalars下面是一個使用GsonConverterFactory類來生成GitHubService接口的實現的示例,該接口使用Gson進行反序列化。
如果您需要與使用Retrofit不支持的內容格式的API進行通信 或者您希望使用不同的庫來實現現有的格式 你可以輕松地創建自己的轉換器。創建一個擴展Converter.Factory類的類,并在構建適配器時傳遞實例。
引用: Retrofit 官網 http://square.github.io/retrofit/#introduction 翻譯 http://blog.csdn.net/hf_zhang/article/details/52473872
|
新聞熱點
疑難解答