前言
retrofit基于okhttp封裝的網路請求框架,網路請求的作業本質上是 OkHttp 完成,而 retrofit 僅負責網路請求介面的封裝,Retrofit將每個網路請求定義為java介面的一個方法,定義路徑可以由方法的注解提供,header和請求引數可以由方法的引數提供,回傳一個Retrofit的Call物件,這種Call對接類似OkHttp的Call,可以有execute和enqueue兩種方式執行網路請求,分別是同步和異步,Retrofit優勢,就是簡潔易用,解耦,擴展性強,可搭配多種Json決議框架(例如Gson,FastJson),
官方地址:https://square.github.io/retrofit/
Retrofit注解
請求方法
注解代碼 請求格式
@GET GET請求
@POST POST請求
@DELETE DELETE請求
@HEAD HEAD請求
@OPTIONS OPTIONS請求
@PATCH PATCH請求
請求引數
注解代碼 說明
@Headers 添加請求頭
@Path 替換路徑
@Query 替代引數值,通常是結合get請求的
@FormUrlEncoded 用表單資料提交
@Field 替換引數值,是結合post請求的
添加依賴
在build.grale添加如下依賴:
implementation 'com.squareup.retrofit2:retrofit:2.6.2'
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
添加網路權限
<uses-permission android:name="android.permission.INTERNET"/>
創建物體類
創建物體類用于保存服務器回傳的資料
public class User {
private String userName;
private String userPassWord;
public User() {
}
public User(String userName, String userPassWord) {
this.userName = userName;
this.userPassWord = userPassWord;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassWord() {
return userPassWord;
}
public void setUserPassWord(String userPassWord) {
this.userPassWord = userPassWord;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", userPassWord='" + userPassWord + '\'' +
'}';
}
}
創建一個網路請求介面
public interface UserApi {
@FormUrlEncoded
@POST("test/login") //網路請求路徑
Call<User> login(@Field("userName") String userName, @Field("userPassWord") String userPassWord);
@GET("test/getUser")
Call<List<User>> getUser(@Query("num") String num, @Query("page")String page);
}
創建Retrofit請求基礎配置
public class HttpUtil {
private Retrofit mRetrofit;
private void initHttpBase() {
mRetrofit = new Retrofit.Builder()
.baseUrl("http://127.0.0.1:retrofi/test")//base的網路地址 baseUrl不能為空,且強制要求必需以 / 斜杠結尾
.addConverterFactory(GsonConverterFactory.create())//使用Gson決議
.callbackExecutor(Executors.newSingleThreadExecutor())//使用單獨的執行緒處理
.build();
}
}
請求網路
這里的mRetrofit.create創建的介面服務,通過 call.enqueue()執行請求,請求成功之后會回到onResponse方法,失敗會回到onFailure方法,
private void loginHttp(){
UserApi userApi = mRetrofit.create(UserApi.class);
Call<User> call = userApi.login("tony", "123456");
call.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
User user = response.body();
Log.e(TAG, "onResponse: userName="+user.getUserName());
Log.e(TAG, "onResponse: userPassrod="+user.getUserPassWord());
}
@Override
public void onFailure(Call<User> call, Throwable t) {
Log.e(TAG, "onFailure: 網路請求失敗="+t.getMessage());
}
});
}
這樣,我們就完成了一個網路請求
取消網路請求
如果想取消網路,呼叫如下方法,
call.cancel();
如何給請求添加Header頭
以固定資料的形式添加頭資訊
只需要使用@headers標簽,就可以給請求添加頭資訊
@Headers({"contentUrl:www.baidu.com","content:java"})
@GET("test/getUser")
Call<List<User>> getUser(@Query("num") String num, @Query("page")String page);
以非固定資料的形式添加頭資訊
@POST("test/logout")
Call<User> logout(@Header("content") String content);
添加配置的OkHttpClient(主要使用請求超時/攔截器等功能)
使用Okhttp的方式來配置比如請求超時時間/設定攔截器等等
private void initHttpBase() {
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.retryOnConnectionFailure(false) //在連接失敗時重試
.callTimeout(50, TimeUnit.SECONDS) //呼叫超時,設定此引數為整體流程請求的超時時間
.connectTimeout(30,TimeUnit.SECONDS)//連接超時
.readTimeout(30,TimeUnit.SECONDS)//讀取超時
.writeTimeout(30,TimeUnit.SECONDS)//寫入超時
.callTimeout(3,TimeUnit.SECONDS)//呼叫超時,設定此引數為整體流程請求的超時時間
.build();
mRetrofit = new Retrofit.Builder()
.client(okHttpClient)
.baseUrl("http://127.0.0.1:retrofi/test")//base的網路地址 baseUrl不能為空,且強制要求必需以 / 斜杠結尾
.addConverterFactory(GsonConverterFactory.create())//使用Gson決議
.callbackExecutor(Executors.newSingleThreadExecutor())//使用單獨的執行緒處理
.build();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/282637.html
標籤:其他
上一篇:qt中如何使用mutiset呢,或者可以告訴我多載qset的方法
下一篇:進入Github時失敗的處理方法
