android studio Retrofit을 이용한 POST요청
이전글 android studio Retrofit을 이용한 GET요청 링크
이전글과 마찬가지로 POST를 이용하여 API요청을 android에서 진행하겠습니다.
이전 글에서 1, 2번을 진행해야 합니다. 그리고 이전글의 연장선으로 코드를 작성하도록 하겠습니다.
이번글도 마찬가지로 요청할 RestAPI 주소는 reqres에 보내도록 하겠습니다. RestAPI를 테스트 하기 위한 서버가 있으며 링크를 참고하시면 됩니다.
Android에서 요청할 테스트 서버는 REQRES에서 진행하도록 하겠습니다.(링크)
1. POST요청을 할 API
![]() |
사진1) POST CREATE 요청 및 응답 |
해당 사진1에서 서버로 보낼 요청과 응답을 확인할수 있습니다. 요청에는 body값이 들어가는데 이때 name, job이 들어갑니다.
2. 서버로 보낼 요청 Class(UserInsertOneRecord) 만들기
Get요청에서 uid하나만 보낸것과 달리 POST에서는 2개의 데이터를 보내야 합니다. 이를 위해 데이터를 보내기 위한 클래스를 생성해야 합니다.
package com.example.restapi_test;
public class UserInsertOneRecord {
// 서버로 보낼 요청값은 name, job이고 둘다 String타입 이다.
String name, job;
// UserInsertOneRecord Getter
// name값을 불러온다.
public String getName() {
return name;
}
// job값을 불러온다.
public String getJob() {
return job;
}
// UserInsertOneRecord Setter
// name값을 입력한다.
public void setName(String name) {
this.name = name;
}
// job값을입력한다.
public void setJob(String job) {
this.job = job;
}
}
code1)
다른 방법으로도 가능하다 construct를 이용하는 방법이다. 단지 이를 사용하면 MainActivity가 조금 달라질수 있다.
package com.example.restapi_test;
public class UserInsertOneRecord {
// 서버로 보낼 요청값은 name, job이고 둘다 String타입 이다.
String name, job;
public UserInsertOneRecord(String name, String job) {
this.name = name;
this.job = job;
}
}
code2) 개선된 코드
3. 서버로 받을 응답 Class(UserGetOneRecord) 만들기
Get요청과 비슷하게 해당 응답을 Class으로 받습니다. 총 4개의 데이터를 받는데 이때 id값도 String으로 받습니다.
package com.example.restapi_test;
public class UserGetOneRecord {
// 서버로 보낸 응답값 4개중 String(name, job, createdAt)과 int(id)로 나눈다.
String name, job, createdAt;
int id;
// UserGetOneRecord Getter
// name값을 불러온다.
public String getName() {
return name;
}
// job값을 불러온다
public String getJob() {
return job;
}
// createdAt값을 불러온다.
public String getCreatedAt() {
return createdAt;
}
// 해당 record값의 id를 불러온다.
public int getId() {
return id;
}
// UserGetOneRecord Setter
// name값을 입력한다.
public void setName(String name) {
this.name = name;
}
// job값을 입력한다.
public void setJob(String job) {
this.job = job;
}
// createdAt값을 입력한다.
public void setCreatedAt(String createdAt) {
this.createdAt = createdAt;
}
// id값을 입력한다.
public void setId(int id) {
this.id = id;
}
}
4. 버튼 클릭시 서버로 POST(CREATE)요청을 보냅니다.
package com.example.restapi_test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
public class MainActivity extends AppCompatActivity {
// Get요청을 보내는 버튼
Button sendGetRequestBtn;
// 응답받은 데이터를 표시하는 TextView
TextView responseData;
// 유저의 ID를 입력할수 있는 입력창
EditText inputUserId;
// API요청후 응답받을 값을 정의한다.
RequestUser requestUser;
// SINGLE USER에서 받는 응답의 INTERFACE만들기
interface RequestUser{
// Get요청을 주는 주는 주소는 /api/users/{유저ID}
@GET("/api/users/{uid}")
// Call은 해당 API를 요청시 서버에서 받을수 있는 데이터 양식(JSON)을 정의해 준다. UserSingleData대로 서버에서 응답이 온다.
// 변수 uid는 @GET요청의 {uid}와 연결하기 위해서 앞단에 @Path("uid")를 추가하여 요청시 해당 uid값이 바르게 입력되도록 한다.
Call<UserSingleData> getOneUser(@Path("uid") int uid);
// Post요청을 주는 주소는 /api/users
@POST("/api/users")
Call<UserGetOneRecord> postOneUser(@Body UserInsertOneRecord users);
}
Button sendPostRequestBtn;
EditText inputUserName;
EditText inputUserJob;
TextView responseDataPost;
// API의 POST요청후 응답받을 값을 저의
UserGetOneRecord requestInsertUser;
UserInsertOneRecord createOneUserRecord;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// activity_main.xml의 View와 Java를 연결한다.(GET 부분)
sendGetRequestBtn = findViewById(R.id.button);
responseData = findViewById(R.id.textView);
inputUserId = findViewById(R.id.editTextNumber);
// activity_main.xml의 View와 Java를 연결합니다(POST 부분)
sendPostRequestBtn = findViewById(R.id.button2);
inputUserName = findViewById(R.id.editTextName);
inputUserJob = findViewById(R.id.editTextJob);
responseDataPost = findViewById(R.id.textViewJob);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://reqres.in") // Base URL을 입력한다.
.addConverterFactory(GsonConverterFactory.create()) // 응답받은 JSON타입 데이터를 Gson을 이용하여 JAVA에서 읽을수 있게 변환한다.
.build(); // retrofit을 build한다.
requestUser= retrofit.create(RequestUser.class); // Request요청이 가능하도록 requestUser를 생성
// 버튼을 클릭하면 발생할 이벤트 작성
sendGetRequestBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int uid = Integer.parseInt(inputUserId.getText().toString());
requestUser.getOneUser(uid).enqueue(new Callback<UserSingleData>() {
@Override
public void onResponse(Call<UserSingleData> call, Response<UserSingleData> response) {
// 정상적으로 응답을 받을시
responseData.setText("first name : "+response.body().data.first_name + "\n" + "last name : " + response.body().data.last_name);
}
@Override
public void onFailure(Call<UserSingleData> call, Throwable t) {
// 에러 발생시
responseData.setText(t.getMessage());
}
});
}
});
sendPostRequestBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
createOneUserRecord = new UserInsertOneRecord(); // 서버에 보낼 요청값을 생성합니다.
createOneUserRecord.setName(inputUserName.getText().toString()); // name값을 입력합니다.
createOneUserRecord.setJob(inputUserJob.getText().toString()); // job값을 입력합니다.
// 해당 createOneUserRecord데이터를 서버쪽으로 요청합니다.
requestUser.postOneUser(createOneUserRecord).enqueue(new Callback<UserGetOneRecord>() {
@Override
public void onResponse(Call<UserGetOneRecord> call, Response<UserGetOneRecord> response) {
// 정상적으로 응답이 올경우 아래와 같이 TextView에 표시합니다.
responseDataPost.setText(
"id : " + response.body().getId() + "\n"
+ "name : " + response.body().getName() + "\n"
+ "job : " + response.body().getJob() + "\n"
+ "createdAt : " + response.body().getCreatedAt() + "\n"
);
}
@Override
public void onFailure(Call<UserGetOneRecord> call, Throwable t) {
responseData.setText(t.getMessage());
}
});
}
});
}
}
위의 코드와 갖이 POST부분을 추가하여 코딩을 해줍니다.
만약 code2를 UserInsertOneRecord에 적용했으면 아래 코드로 적용해야 합니다.
package com.example.restapi_test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;
public class MainActivity extends AppCompatActivity {
// Get요청을 보내는 버튼
Button sendGetRequestBtn;
// 응답받은 데이터를 표시하는 TextView
TextView responseData;
// 유저의 ID를 입력할수 있는 입력창
EditText inputUserId;
// API요청후 응답받을 값을 정의한다.
RequestUser requestUser;
// SINGLE USER에서 받는 응답의 INTERFACE만들기
interface RequestUser{
// Get요청을 주는 주는 주소는 /api/users/{유저ID}
@GET("/api/users/{uid}")
// Call은 해당 API를 요청시 서버에서 받을수 있는 데이터 양식(JSON)을 정의해 준다. UserSingleData대로 서버에서 응답이 온다.
// 변수 uid는 @GET요청의 {uid}와 연결하기 위해서 앞단에 @Path("uid")를 추가하여 요청시 해당 uid값이 바르게 입력되도록 한다.
Call<UserSingleData> getOneUser(@Path("uid") int uid);
// Post요청을 주는 주소는 /api/users
@POST("/api/users")
Call<UserGetOneRecord> postOneUser(@Body UserInsertOneRecord users);
}
Button sendPostRequestBtn;
EditText inputUserName;
EditText inputUserJob;
TextView responseDataPost;
// API의 POST요청후 응답받을 값을 저의
UserGetOneRecord requestInsertUser;
UserInsertOneRecord createOneUserRecord;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// activity_main.xml의 View와 Java를 연결한다.(GET 부분)
sendGetRequestBtn = findViewById(R.id.button);
responseData = findViewById(R.id.textView);
inputUserId = findViewById(R.id.editTextNumber);
// activity_main.xml의 View와 Java를 연결합니다(POST 부분)
sendPostRequestBtn = findViewById(R.id.button2);
inputUserName = findViewById(R.id.editTextName);
inputUserJob = findViewById(R.id.editTextJob);
responseDataPost = findViewById(R.id.textViewJob);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://reqres.in") // Base URL을 입력한다.
.addConverterFactory(GsonConverterFactory.create()) // 응답받은 JSON타입 데이터를 Gson을 이용하여 JAVA에서 읽을수 있게 변환한다.
.build(); // retrofit을 build한다.
requestUser= retrofit.create(RequestUser.class); // Request요청이 가능하도록 requestUser를 생성
// 버튼을 클릭하면 발생할 이벤트 작성(GET부분)
sendGetRequestBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int uid = Integer.parseInt(inputUserId.getText().toString());
requestUser.getOneUser(uid).enqueue(new Callback<UserSingleData>() {
@Override
public void onResponse(Call<UserSingleData> call, Response<UserSingleData> response) {
// 정상적으로 응답을 받을시
responseData.setText("first name : "+response.body().data.first_name + "\n" + "last name : " + response.body().data.last_name);
}
@Override
public void onFailure(Call<UserSingleData> call, Throwable t) {
// 에러 발생시
responseData.setText(t.getMessage());
}
});
}
});// 버튼을 클릭하면 발생할 이벤트 작성(POST부분)sendPostRequestBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
createOneUserRecord = new UserInsertOneRecord(
inputUserName.getText().toString(),
inputUserJob.getText().toString()
); // 서버에 보낼 요청값을 생성합니다.
// createOneUserRecord.setName(inputUserName.getText().toString()); // name값을 입력합니다.
// createOneUserRecord.setJob(inputUserJob.getText().toString()); // job값을 입력합니다.
// 해당 createOneUserRecord데이터를 서버쪽으로 요청합니다.
requestUser.postOneUser(createOneUserRecord).enqueue(new Callback<UserGetOneRecord>() {
@Override
public void onResponse(Call<UserGetOneRecord> call, Response<UserGetOneRecord> response) {
// 정상적으로 응답이 올경우 아래와 같이 TextView에 표시합니다.
responseDataPost.setText(
"id : " + response.body().getId() + "\n"
+ "name : " + response.body().getName() + "\n"
+ "job : " + response.body().getJob() + "\n"
+ "createdAt : " + response.body().getCreatedAt() + "\n"
);
}
@Override
public void onFailure(Call<UserGetOneRecord> call, Throwable t) {
responseData.setText(t.getMessage());
}
});
}
});
}
}
5. 결과
이상으로 POST요청하는 방법에 대해서 글을 작성했습니다.
gitHub : https://github.com/Alex-Choi0/android_excercise_api_request/tree/request_post
댓글
댓글 쓰기