Retrofit 是一套由 Square 所開發維護的函式庫,並且基於 okhttp 以及遵循 Restful API,讓我們在進行一些網路操作的工作時,能夠提高效率。
相較於比較常見的Volley或是AsyncTask都是比要有效率的,這也是retrofit的強大之處。
//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
//retrofit gson轉換(版本需與retrofit一致)
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'
//網路權限
<uses-permission android:name="android.permission.INTERNET"/>
測試網址:https://jsonplaceholder.typicode.com/posts
//網址後的內容,ex:https://jsonplaceholder.typicode.com/posts,這裡輸入的是BaseUrl以外的位址(posts)
@GET("posts")
Call<List<DataFromApi>> getPosts();
//傳入參數@Query(方法GET)
@GET("posts")
//Query數據在URL上
Call<List<Albums>> getPosts(
@Query("userId") int userId,
@Query("_sort") String sort,
@Query("_order") String order
);
//傳入參數方式@Body(方法POST)
@POST ("posts")// 用@Body表示要傳送Body資料
Call<DataFromApi> createPost(@Body DataFromApi post);
@GET postman 示範
@Query postman 示範
@POST postman 示範
2. 建立RetrofitManager
public class RetrofitManager {
private static RetrofitManager mInstance = new RetrofitManager();
private Retrofit retrofit;
public MyAPIService myAPIService;
public RetrofitManager(){
retrofit = new Retrofit.Builder()
//api的URL,注意最後須要/,不然會報錯
.baseUrl("https://jsonplaceholder.typicode.com/")
//轉換成Gson的工具
.addConverterFactory(GsonConverterFactory.create())
//建立
.build();
//將Http相關請求的介面與Retrofit做連結
myAPIService = retrofit.create(MyAPIService.class);
}
public static RetrofitManager getInstance(){
return mInstance;
}
public MyAPIService getService(){
return myAPIService ;
}
}
retrofit的建立加入Gson轉換、api的BaeUrl以及與介面(http請求)綁定。
3. Call Api (GET/POST)
//獲得所有Post資料
RetrofitManager.getInstance().getService().getPosts().enqueue(new Callback<List<DataFromApi>>() {
@Override
public void onResponse(Call<List<DataFromApi>> call, Response<List<DataFromApi>> response) {
StringBuilder result = new StringBuilder();
if(!response.isSuccessful()){
result_txt.setText(response.code());
return;
}
List<DataFromApi> responseBody = response.body();
for(DataFromApi dataFromApi:responseBody){
result.append("{").append("\n");
//獲取資料,並整理
result.append("ID: ").append(dataFromApi.getId()).append("\n") ;
result.append("User ID: ").append(dataFromApi.getUserId()).append("\n") ;
result.append("Title: ").append(dataFromApi.getTitle()).append("\n") ;
result.append("Text: ").append(dataFromApi.getText()).append("\n") ;
result.append("},").append("\n");
}
result_txt.setText(result.toString());
Log.d("result", "onResponse: "+result);
}
@Override
public void onFailure(Call<List<DataFromApi>> call, Throwable t) {
}
});
註:onResponse()、onFailure()都是在主線程執行的。可以用來直接更新UI等操作,這也是Retrofit一大特色喔,可以回去我昨天的okhttp比較看看。
...
//okhttp3
implementation 'com.squareup.okhttp3:okhttp:4.0.1'
//攔截器
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1'
先上程式碼
//OkHttpClient
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
.connectTimeout(30, TimeUnit.SECONDS) // 設置連線Timeout
.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC))
.build();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/")
.addConverterFactory(GsonConverterFactory.create())
//新增OkHttpClient
.client(okHttpClient)
.build();
myAPIService = retrofit.create(MyAPIService.class);
也就是在原本建立Retrofit的地方,加入昨天建立Okhttp的方式,最後並在創立Retrofit時加入OkHttpClient,這樣一來就能看到OkHttpClient的優點,讓我們方便觀察狀態了,是不是很棒呢!~