iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
Mobile Development

android studio 30天學習筆記系列 第 5

android studio 30天學習筆記-day 5-介紹retrofit(一)

在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格式一模一樣https://ithelp.ithome.com.tw/upload/images/20210707/201389664U8o7Euux7.png

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的值了

結果
https://ithelp.ithome.com.tw/upload/images/20210707/201389665VzVkb31tk.png

明天會介紹retrofit各個步驟


上一篇
android studio 30天學習筆記 -day 4-Notification
下一篇
android studio 30天學習筆記-day 6-介紹retrofit(二)
系列文
android studio 30天學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
screenleon
iT邦新手 1 級 ‧ 2021-10-22 11:11:26

我有試著跑你的範例 但結果是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" 上的資料都抓下來,因此才會需要用到陣列儲存。

感謝有你的回應。

我要留言

立即登入留言