Retrofit學習總結筆記

這是個人學習筆記!!!個人學習筆記!!!

Retrofit通過大範圍註解解化Http請求。使用Picasso處理圖片,依賴okHttp實現。

一.創建對象,網絡請求方式,獲取回調方法...

1.創建Retrofit對象

//創建retrofit,通過GsonConverterFactory.create爲Retrofit添加Gson支持
Retrofit retrofit=new Retrofit.Builder()
        .client(new OkHttpClient())
        .addConverterFactory(GsonConverterFactory.create())   //設置數據解析器
        //baseUrl一定以/爲結束
        .baseUrl("http://...")    //設置網絡請求url地址
        .build();

處理用Gson來處理,轉換。

這種方式是最簡單的創建方式。

Retrofit是用okHttp來實現的,也可以自定義okHttp來進行網絡請求

例子如下:

//可以自定義okHttp,用Retrofit來請求網絡
private void setOkHttpClient(){
    final OkHttpClient client = new OkHttpClient();
    client.interceptors().add(new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Response response = chain.proceed(chain.request());
            // Do anything with response here
            return response;
        }
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://...")
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    });
}

2.網絡請求的接口  *接口中每個方法的參數都需要使用註解標註,否則會報錯

public interface NetWorkService {
    //定義請求接口
    @GET("openapi.do?keyfrom=Yanzhikai&key=2032414398&type=data&doctype=json&version=1.1&q=car")
    Call<String> getData();//getData()接收網絡請求數據的方法    <String>是接收數據的類型
}

*Retrofit把網絡請求的Url分成了兩個部分。

第一部分:是這裏的@GET裏面的內容

public interface NetWorkService {
    //定義請求接口
    @GET("openapi.do?keyfrom=Yanzhikai&key=2032414398&type=data&doctype=json&version=1.1&q=car")
    Call<String> getData();//getData()接收網絡請求數據的方法    <String>是接收數據的類型
}

第二部分:是在創建Retrofit實例的時候,通過baseUrl設置的

//創建retrofit,且讓ResponseBodygson轉化爲json
Retrofit retrofit=new Retrofit.Builder()
        .client(new OkHttpClient())
        .addConverterFactory(GsonConverterFactory.create(gson))
        .baseUrl("http://....")
        .build();

推薦組合完整url的方式是: baseUrl=目錄形式   url=相對路徑  

baseUrl=http://host:port/good/   url=apath 

完整Url:http://host:port/good/url

標籤:@HTTP 他的作用是可以替換@GET @POST @PUT @DELETE @HEAD這些註解。

//1.網絡請求的方法 2.網絡請求地址路徑 3.是否有請求體
@HTTP(method = "post",path = "blog/{id}",hasBody = false)
Call<ResponseBody> getData(@Path("id") int id);
//{id}表示是一個變量  method的值Retrofit不會做處理,要自行確保正確

@FormUrlEncoded :發送編碼表單數據。每個鍵值對需要用@Filed來註解鍵,隨後的對象需要提供值。

@POST("/form")
@FormUrlEncoded  //表明這是個表單格式的請求
Call<ResponseBody> testFormUrlEncoded1(@Field("userName") String userName,@Field("age")int age);

       在Retrofit中的用法:

NetWorkService mNetWorkService=retrofit.create(NetWorkService.class);
Call<ResponseBody> mcall=mNetWorkService.testFormUrlEncoded1("Jack",10);

@Multipart:發送編碼表單數據。適用於有文件上傳的上傳場景。

@POST("/form")
@Multipart
Call<ResponseBody> testMultipart(
        @Part("userName")ResponseBody name, @Part("age")ResponseBody age, @Part MultipartBody.Part file);

      實際用法:

MediaType textType = MediaType.parse("text/plain");
ResponseBody userName=ResponseBody.create(textType,"Rose");
ResponseBody age=ResponseBody.create(textType,"19");
MultipartBody.Part filePart=MultipartBody.Part.createFormData("file","info.txt",file);
Call<ResponseBody> callPart=mNetWorkService.testMultipart(userName,age,filePart);

二.網絡請求參數

1.@Header&@Headers

作用:添加請求頭&添加不固定的請求頭

/**
 * @Header用於添加不固定的請求頭   @Headers用於添加固定的請求頭
 * @Header作用於方法的參數   @Headers作用於方法
 */
//@Header
@GET("user")
Call<User> getUser(@Header("Authorization")String authorization);

//@Headers
@Headers("Authorization:authorization")
@GET("user")
Call<String> getUser();

2.@body

作用:以post方式傳遞自定義數據類型給服務器

*若提交的是一個Map,作用相當於@Field

map要經過FormBody.Builder類處理成符合OkHttp格式的表單

//@bodyMap
FormBody.Builder formBuild=new FormBody.Builder();
formBuild.add("key","value");

3.@Field&FieldMap

作用:發送Post時提交請求的表單字段

//@FieldFormUrlEncoded配合使用
@POST("/form")
@FormUrlEncoded
//將後面的name1的取值作爲name的值
Call<ResponseBody> testFormUrl(@Field("name")String name1,@Field("height")float height);

//FieldMap

//mapkey作爲表單的鍵
@POST("/form")
@FormUrlEncoded
Call<ResponseBody> testFormUrlOfMap(@FieldMap Map<Object,Object> map);

在類中具體的使用

//Field具體使用
Call<ResponseBody> callField=netWorkService.testFormUrlOfField("Jack",1.2f);
//FieldMap具體使用
Map<Object,Object> mapFiled=new HashMap<Object, Object>();
mapFiled.put("name","Jack");
mapFiled.put("height","1.80");
Call<ResponseBody> callFieldMap=netWorkService.testFormUrlOfMap(mapFiled);

4.@Part&PartMap

作用:發送post請求時提交請求的表單字段

與Field的功能相似,但是它的參數類型更加多。它包括了數據流,所以它適用於有文件上傳的情況。

A.@Part

@POST("/form")
@Multipart
Call<ResponseBody> testMultipart(
        @Part("userName")ResponseBody name, @Part("age")ResponseBody age, @Part MultipartBody.Part file);

B.@PartMap

@POST("/form")
@Multipart
//PartMap註解支持map對象
Call<ResponseBody> testPartMap(@PartMap Map<String,Object> map,@Part("name")String userName,
                               @Part MultipartBody.Part file);

具體使用:

@Part

ResponseBody name = null;
ResponseBody age=null;
//Part&PartMap具體使用
MultipartBody.Part filedMap=MultipartBody.Part.createFormData("file","test.txt",file1);
Call<ResponseBody> callPart=netWorkService.testMultipart(name,age,filedMap);

@PartMap

Map<Object,Object> mapPartMap=new HashMap<Object, Object>();
mapFiled.put("name","Jack");
mapFiled.put("height","1.80");
Call<ResponseBody> callPartMap=netWorkService.testPartMap(mapPartMap,"Jack",filedMap);

5.@Query&@QueryMap

作用:用於Get方法的參數查詢(Query = Url 中 ‘?’ 後面的 key-value

eq:url=http://www.aa.com/?type=android     這裏的@Query=type

@GET("/")
Call<String> query(@Query("type")String type);

6.@Path

作用:Url地址的缺省值

//@Path
@GET("users/{user}/respos")
Call<ResponseBody> getPath(@Path("user")String user);//path那裏的user會替換掉{user}的值

7.@Url

作用:直接傳入一個Url的變量,用於Url設置

@GET
Call<ResponseBody> testUrlAndQuery(@Url String url);//@url註解的時候,@GET傳入的Url就可以省略

基本的註解符號大全,解釋+作用



三.Retrofit對象內的各種對象解析

Retrofit對象創建過程如下

Gson gson=new GsonBuilder().setDateFormat("yyyy-MM-dd hh:mm:ss").create();
//創建retrofit,且讓ResponseBodygson轉化爲json
Retrofit retrofit=new Retrofit.Builder()
        .client(new OkHttpClient())
        .addConverterFactory(GsonConverterFactory.create(gson))
        .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//支持RxJava平臺
        .baseUrl("")
        .build();

1.關於數據解析器(convert)

Retrofit支持多種數據解析方式。使用時記得在build中添加依賴庫。依賴庫如下。

數據解析器Gradle依賴
Gsoncom.squareup.retrofit2:converter-gson:2.0.2
Jacksoncom.squareup.retrofit2:converter-jackson:2.0.2
Simple XMLcom.squareup.retrofit2:converter-simplexml:2.0.2
Protobufcom.squareup.retrofit2:converter-protobuf:2.0.2
Moshicom.squareup.retrofit2:converter-moshi:2.0.2
Wirecom.squareup.retrofit2:converter-wire:2.0.2
Scalarscom.squareup.retrofit2:converter-scalars:2.0.2
2.網絡請求適配器(CallAdapter)
Retrofit支持多種網絡請求適配器方式:guava,java8和rxjava。如果使用默認的網絡請求適配器,那麼不需要再添加依賴,如果需要使用其他的幾種適配器,則還需要添加依賴。

3.網絡請求接口實例
//網絡請求接口實例
NetWorkService netWork=retrofit.create(NetWorkService.class);//NetWorkService是網絡請求接口
Call<String> callNetWork=netWork.getCall();//getCall是NetWorkService裏面的方法

在NetWorkService裏面的getCall()方法

@GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20world")
Call<String> getCall();

4.(異步/同步)發送網絡請求

封裝了數據轉換,線程切換的操作

<1>異步

//網絡請求接口實例
NetWorkService netWork=retrofit.create(NetWorkService.class);
Call<String> callNetWork=netWork.getCall();
//異步發送網絡請求
callNetWork.enqueue(new Callback<String>() {
    @Override
    public void onResponse(Call<String> call, retrofit2.Response<String> response) {
        response.body().show();//請求處理,輸出結果
    }

    @Override
    public void onFailure(Call<String> call, Throwable t) {
        Log.i("t","連接失敗");
    }
});

<2>同步

//同步發送網絡請求
try {
    Response<Reception> response=call.execute();
} catch (IOException e) {
    e.printStackTrace();
}

5.處理返回數據

從上面的例子都可以看出來,結果是根據Response類的body()返回的數據來進行處理。


最後我們把上面這些步驟串聯起來,發送並處理一個異步網絡請求。(NetWorkService是一個接口,裏面是選擇網絡請求方式,以及一些url地址,參數等)。

private void goRetrofitDemo(){
    //創建Retrofit對象
    Retrofit retrofit=new Retrofit.Builder()
            .baseUrl("http://fanyi.youdao.com")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    //創建網絡請求接口實例
    NetWorkService netWorkServiceInterface=retrofit.create(NetWorkService.class);

    //對發出請求進行封裝
    Call<String> callNet=netWorkServiceInterface.getCall();
    //異步發出網絡請求
    callNet.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call<String> call, retrofit2.Response<String> response) {
            response.body().toString();//處理返回結果
        }

        @Override
        public void onFailure(Call<String> call, Throwable t) {

        }
    });

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章