Retrofit相關(guān)依賴
implementation'com.squareup.retrofit2:retrofit:2.9.0'
implementation'com.squareup.retrofit2:converter-gson:2.9.0'
基本使用步驟:
在進行請求之前,要先創(chuàng)建一個接口:
public interface HttpBinService {
//所有的請求都要以注解的方式進行聲明
//有兩種提方式:FormUrlEncoded(對應(yīng)key-value形式)或者MulityPart(文件形式)
//@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方式進行請求
沒有添加@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,只看傳遞進來的地址
@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) {
}
});
}