在android開發,很常會用到網絡資料請求的套件,retrofit是一種 HTTP 請求的工具,使用 REST API 設計,由 RESTful Client 向 Server 發出請求。
retrofit使用
首先在gradle加入
implementation'com.squareup.retrofit2:retrofit:2.5.0'
implementation'com.squareup.retrofit2:converter-gson:2.5.0'
在androidManifest.xml添加權限
<uses-permission android:name="android.permission.INTERNET"/>
創建DataItem資料類別
必須跟你Json格式一模一樣
public class DataItem {
private int userId;
private int id;
private String title;
@SerializedName("body")//@SerializedName註解可以讓String text得到body的值
private String text;
public int getUserId() {
return userId;
}
public int getId() {
return id;
}
public String getTitle() {
return title;
}
public String getText() {
return text;
}
創建interface
public interface ApiGet {
@GET("posts")
Call<DataItem> getPosts();
}
回到MainActivity建立retrofit(寫在onCreate())
Retrofit retrofit=new Retrofit.Builder()
.baseUrl("https://jsonplaceholder.typicode.com/") //連接你要的uri
.addConverterFactory(GsonConverterFactory.create()) //gson解析
.build();
ApiGet apiGet =retrofit.create(ApiGet.class);
Call<DataItem> call =apiGet.getPosts(); //呼叫call連線服務
call.enqueue(new Callback<DataItem>() { //透過 Callback 來等待回傳成功或失敗的資料
@Override
public void onResponse(Call<DataItem> call, Response<DataItem> response) {
Log.d("API", "id: " + response.body().getId());
Log.d("API", "User Id: " + response.body().getUserId());
Log.d("API", "Title: " + response.body().getTitle());
Log.d("API", "Text: " + response.body().getText());
}
@Override
public void onFailure(Call<DataItem> call, Throwable t) {
Log.d("API", "fail");
}
});
這樣就從 https://jsonplaceholder.typicode.com/ 可以得到get的值了
結果
明天會介紹retrofit各個步驟
我有試著跑你的範例 但結果是fail
apiGet.getPosts().enqueue(new Callback<DataItem[]>() {
@Override
public void onResponse(Call<DataItem[]> call, Response<DataItem[]> response) {
for (DataItem item : response.body()) {
Log.d("API", "id: " + response.body().getId());
Log.d("API", "User Id: " + response.body().getUserId());
Log.d("API", "Title: " + response.body().getTitle());
Log.d("API", "Text: " + response.body().getText());
}
}
});
可能需要改成用陣列存 至少範例程式能跑成功
抱歉,我之後在ApiGet的GET方法修改為抓"https://jsonplaceholder.typicode.com/posts" id欄位為1的資料
public interface ApiGet {
@GET("posts/1")
Call<DataItem> getPosts();
}
這樣以上的範例程式就可以執行了。
另外,在@GET("posts")不設定抓任何一筆id欄位的資料的情況下,
會把"https://jsonplaceholder.typicode.com/posts" 上的資料都抓下來,因此才會需要用到陣列儲存。
感謝有你的回應。