Retrofit的使用

Retrofit相關(guān)依賴

  implementation'com.squareup.retrofit2:retrofit:2.9.0'
  implementation'com.squareup.retrofit2:converter-gson:2.9.0'

基本使用步驟:

在進(jìn)行請求之前,要先創(chuàng)建一個接口:

public interface HttpBinService {
    //所有的請求都要以注解的方式進(jìn)行聲明

    //有兩種提方式:FormUrlEncoded(對應(yīng)key-value形式)或者M(jìn)ulityPart(文件形式)
    //@Field("xxx")這里面是傳的參數(shù)的名字
    //https:www.httpbin.org/post xxx=value
    //括號后面是拼接在請求BaseUrl后面的,"https://www.httpbin.org/get?username=張三&pwd=456"
   //這里是以表單的形式提交的
    @POST("post")
    @FormUrlEncoded
    Call<ResponseBody> post(@Field("username") String name, @Field("pwd") String password);

    //get請求要傳參數(shù),使用的就是Query;post請求要傳參數(shù),使用的就是Field
    @GET("get")
    Call<ResponseBody> get(@Query("username") String username, @Query("pwd") String password);

}

接口創(chuàng)建好之后在對應(yīng)位置聲明成員變量和初始化retrofit和接口實例化對象

  private Retrofit retrofit;
  private HttpBinService binService;

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        retrofit = new Retrofit.Builder().baseUrl("https:www.httpbin.org").build();
        binService = retrofit.create(HttpBinService.class);
    }

1.POST請求
  • 請求有同步和異步請求,同步調(diào)用excute,異步調(diào)用enqueue;區(qū)別是同步請求是阻塞執(zhí)行,在沒有收到服務(wù)器反饋之前,不會有任何操作,異步請求是不用等待服務(wù)器反饋,可以繼續(xù)執(zhí)行其他邏輯。
  • 1.1 基礎(chǔ)請求
 //retrofit中的post請求,基礎(chǔ)使用
    public void post(View view) {
        Call<ResponseBody> call = binService.post("xxx", "123");
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse:"+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });
    }
  • 1.2 以RequestBody方式進(jìn)行請求
    沒有添加@FormUrlEncoded注解,但請求返回的形式與之相同
public interface HttpBinService {
  //此處沒有@FormUrlEncoded注解
  @POST("post")
    Call<ResponseBody> postBody(@Body RequestBody body);
}

所以在代碼請求時候需要自己來封裝

  public void postBody(View view) {
        //手動封裝key-value,請求結(jié)果與添加了@FormUrlEncoded注解的形式相同
       //相對于添加@FormUrlEncoded來說更加靈活
        FormBody formBody = new FormBody.Builder()
                .add("a","1").add("b","2").build();
        Call<ResponseBody> bodyCall = binService.postBody(formBody);
        bodyCall.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse:"+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });
    }
  • 1.3使用Path形式來請求
    @Path注解相當(dāng)于替換,將參數(shù)替換并添加到請求地址后面
public interface HttpBinService {
//此時拼接出來的地址形式為: "https://www.httpbin.org/path",
//添加了頭部(用于區(qū)分android和ios),同時以表單形式提交了用戶名和密碼
 @POST("{id}")
    @FormUrlEncoded
    Call<ResponseBody> postInPath(@Path("id") String path
                                  , @Header("os") String os
                                  , @Field("username") String name
                                  , @Field("pwd") String pwd);
}

實際請求如下:

  public void usePath(View view) {
        Call<ResponseBody> call = binService.postInPath("post","android","xxxxx","123456");
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse:"+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

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

            }
        });
    }
  • 1.4使用多個請求頭
    使用多個請求頭的目的一般是用來區(qū)分平臺或者上傳版本號等等
public interface HttpBinService {
  //多個頭
    @Headers({"os:android", "version:1.0.0"})
    @POST("post")
    Call<ResponseBody> postWithHeaders();
}

方法調(diào)用

 public void usePostHeaders(View view) {
        Call<ResponseBody> call = binService.postWithHeaders();
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse:"+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {

            }
        });
    }
  • 1.5使用URL請求
public interface HttpBinService {
  //url注解,也要加上相關(guān)注解POST或者GET,指定的是一個完整的地址,不看BaseUrl,只看傳遞進(jìn)來的地址
    @POST
    Call<ResponseBody> postInUrl(@Url String url);
}

請求地址要自己指定

    public void usePostInUrl(View view) {
       // 自己指定請求地址
        Call<ResponseBody> call = binService.postInUrl("https://www.httpbin.org/post");
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse:"+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {

            }
        });
    }
2.GET請求
  • 和post請求一樣均有同步請求和異步請求,請求方式相同
 //retrofit中的get請求,基礎(chǔ)使用
    public void get(View view) {
        Call<ResponseBody> call = binService.get("bigzing", "456");
        call.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.i(TAG, "onResponse:"+response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
            }
        });
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文為翻譯Retrofit 官方文檔 翻譯不準(zhǔn)確,所以配上英文。此操作只為自己方便查看。 介紹 Introdu...
    S_ZY閱讀 815評論 0 1
  • 盜版文章 原文非常棒,原文 前言 在Andrroid開發(fā)中,網(wǎng)絡(luò)請求十分常用 而在Android網(wǎng)絡(luò)請求庫中,Re...
    黑色海鷗閱讀 565評論 0 0
  • 2015-03-29 12:00 最近將Android項目的網(wǎng)絡(luò)連接庫切換到了Retrofit 2.0,以前用的V...
    SimpleFunc閱讀 256評論 0 1
  • 引入相關(guān)依賴 在實例中,使用的是Gson對Json數(shù)據(jù)進(jìn)行解析。 下面的實例是對github的接口進(jìn)行請求: (1...
    皓皓amous閱讀 316評論 0 0
  • 前言 最近有個想法——就是把 Android 主流開源框架進(jìn)行深入分析,然后寫成一系列文章,包括該框架的詳細(xì)使用與...
    wildma閱讀 2,113評論 0 14

友情鏈接更多精彩內(nèi)容