iT邦幫忙

2021 iThome 鐵人賽

DAY 21
0
Mobile Development

Android 新手入門學習系列 第 21

Day21 Android - Retrofit(Post)

  • 分享至 

  • twitterImage
  •  

昨天所說的(Get)主要用於取得api的資料,像是昨天https://jsonplaceholder.typicode.com/posts 的網址資料,但今天的post比較屬於我去new一個資料然後透過interface接口去建立、新增資料,實作起來最主要差在接口的部分,其他都大同小異,那麼就開始今天的主題(Post)。

Post的部分主要是要new資料,透過接口去置入資料,那麼就接續昨天的程式來做修改的動作,如果還沒看過前一篇的可以點選Retrofit(Get)

主要會有差異的是Internet接口及主程式,因為是套用同一個網站的資料,所以Model(data一樣)及manager(要連到的地方一樣)可以套用昨天的部分,我在這邊還是再貼一次。

首先一樣添加依賴、權限。

依賴

    //retrofit資源
    implementation 'com.squareup.retrofit2:retrofit:2.7.2'
    //gson轉換器
    implementation 'com.squareup.retrofit2:converter-gson:2.7.2'

權限

<uses-permission android:name="android.permission.INTERNET" />

接著開始看到Model的部分。

Model

Model->data、getter、setter。

public class posts {
    //定義有什麼資料(型態要注意)
    private int userId;
    private int Id;
    private String title;
    private String body;
    //從manager->interface使用call後,使this(這邊)定義的資料=取得的資料
    public posts(int userId,int Id,String title,String body){
        this.userId=userId;
        this.Id=Id;
        this.title=title;
        this.body=body;
    }
    //這邊是我們熟稱的getter、setter,可用於其他class的資料取得或處理
    public int getUserId(){
        return userId;
    }
    public void setUserId(int userId) {
        this.userId = userId;
    }

    public int getId(){
        return Id;
    }
    public void setId(int 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;
    }
}

Manager

//連線基底
public class posts_manager {
    //mInstance為連線轉換(Builder)的物件
    private static posts_manager mInstance = new posts_manager();

    private posts_interface Posts_interface;

    private posts_manager() {
        //使用Builder,Url為要連到的網址,之後addConverterFactory的部分就是加入Gson的轉換器,然後建立在這個retrofit的物件
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://jsonplaceholder.typicode.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .build();
        Posts_interface = retrofit.create(posts_interface.class);
    }
    //回傳Builder方法
    public static posts_manager getInstance() {
        return mInstance;
    }

    //回傳interface的內容(可以使用裡面定義的連線名稱進行連線)
    public posts_interface getAPI() {
        return Posts_interface;
    }
}

Interface接口

昨天設計的Get是這個樣子

GET

import retrofit2.Call;
import retrofit2.http.GET;

public interface posts_interface {
    @GET("posts/1")// posts/1:posts的第一筆資料路徑
    Call<posts> getpost();//取得連線後的回傳資料給posts物件,後者getpost()為此連線的方法名稱
    @GET("posts")//posts多筆資料的路徑 用List包
    Call<List<posts>> getposts();//取得連線後的多筆回傳資料給posts物件並包裝成List,getPosts()為此連線的方法名稱
}

POST

而今天要設計的是POST,所以要用的是@POST。

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;

public interface posts_interface {
    @POST("posts")//將資料傳送新增
    Call<post> posts_data(@Body posts post);//傳送@Body型態的posts資料物件
}

稍後我們可以透過posts_data這個名稱來將我們new的一筆資料傳入新增,型態為@Body。

主程式(MainActivity)

public class MainActivity extends AppCompatActivity {
    posts_interface Posts_interface;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Posts_interface=posts_manager.getInstance().getAPI();
        posts Post = new posts(21,21,"this is a title","this is a body");//new一筆資料
        Call<posts> call = Posts_interface.posts_data(Post);//發送到posts_data函數中,資料Post型態為@Body發送
        call.enqueue(new Callback<posts>() {//建立call連線
            @Override
            public void onResponse(Call<posts> call, Response<posts> response) {//連線成功,取得回傳的東西
                Log.d("Post_TAG","response call:"+response.code());
                Log.d("Post_TAG", "Userid:"+response.body().getUserId());
                Log.d("Post_TAG", "Id:"+response.body().getId());
                Log.d("Post_TAG", "Title:"+response.body().getTitle());
                Log.d("Post_TAG", "Body:"+response.body().getBody());
            }

            @Override
            public void onFailure(Call<posts> call, Throwable t) { //連線失敗
                Log.d("Post_TAG","fail");
            }
        });
    }
}

post主要在發送資料到後台進行新增,像是我現在已經有100筆資料在裡面,透過post我可以進行新增,可能是一筆也可能是多筆(我這邊是新增一筆,也可透過迴圈新增等),而get主要在取得api資料,但都算是蠻重要的兩個應用,那麼明天我就先來提提rxjava的Observe和Observable,之後會讓這部分一起和rxjava做應用!

成果

https://ithelp.ithome.com.tw/upload/images/20211006/201392594HZVx7Hpn6.png
請求成功,狀態碼201。


上一篇
Day20 Android - Retrofit(Get)
下一篇
Day22 Android - RxJava(Observer+Observable)
系列文
Android 新手入門學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言