昨天所說的(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->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;
}
}
//連線基底
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;
}
}
昨天設計的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。
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。
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做應用!
請求成功,狀態碼201。