Retrofit是,由 Square 開發的 Android/Java HTTP 網路請求函式庫,是專為API連線而生的第三方套件,與API連線的效率非常高。它的特點是簡單、型別安全、易於擴充,可以將 API 請求轉換成介面(interface)方法呼叫,並自動處理 JSON/XML 解析。
可能看起來比較難理解,相信實作一次後就比較能理解了
首先請先到build.grade(Module: app)的dependencies加入這兩行。
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
}
然後到AndroidManifest.xml加入網路權限
<uses-permission android:name="android.permission.INTERNET" />
先說明一下,API是 App 跟伺服器溝通的規則和通道 舉例來說就是程式和伺服器調取資料後,再回傳給程式做計算或顯示。
需要創建的比較多,創建完會長這樣,以下是每一頁面的說明
引入套件
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.Callback;
import retrofit2.Response;
import android.util.Log;
代表一筆從 API 拿到的文章資料(或貼文) 接收到 JSON 之後會自動把資料填入這個類別
public class Post {
private String id; //欄位名稱要跟API欄位名稱一致
private String title;
private String body;
private String userId;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getBody() {
return body;
}
public void setBody(String body) {
this.body = body;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
}
import retrofit2.Call;
import retrofit2.http.GET;
//各個連線的接口,每個連線是用GET或POST及其路徑、參數都寫在這裡
public interface ApiService {
@GET("posts/1") // GET 請求,路徑為 posts/1
Call<Post> getPost(); // 回傳 Post 物件,方法名稱為 getPost
}
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
private ApiService apiService;
public ApiService getApiService() {
//建立一個 Retrofit 的建構器
retrofit2.Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/") //API 的基本網址(主機地址)
.addConverterFactory(GsonConverterFactory.create()) // 用 Gson 轉 JSON
.build();
//利用 Retrofit 實例產生 ApiService 的實作物件,這樣你就可以用它來呼叫 API。
apiService = retrofit.create(ApiService.class);
return apiService;
}
}
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//建立 ApiClient 物件實例,用來管理 Retrofit 連線
ApiClient apiClient = new ApiClient();
//呼叫 apiClient 裡的 getApiService() 取得 API 介面實例。
//呼叫 getPost() 執行 API 請求(取得資料)
//用 enqueue() 非同步執行(在背景執行)請求,並監聽Callback(回傳結果) 。
apiClient.getApiService().getPost().enqueue(new Callback<Post>() {
@Override
//回傳成功(主執行緒)
public void onResponse(Call<Post> call, Response<Post> response) {
//取得伺服器回傳的 Post 物件並用 Log 輸出(透過 Gson 自動解析 JSON)
Log.d("note", response.body().getId());
Log.d("note", response.body().getUserId());
Log.d("note", response.body().getTitle());
Log.d("note", response.body().getBody());
}
//回傳失敗
@Override
public void onFailure(Call<Post> call, Throwable t) {
//將錯誤訊息印到 Log
Log.d("note", "response: " + t.toString());
}
});
}
}
執行成果展示: