android studio Retrofit을 이용한 GET요청
Android에서 서버와 API통신을 하는 법에 대해서 알아보겠습니다. 첫번째로 GET요청을 Android에서 보내도록 하겠습니다.
요청할 RestAPI 주소는 reqres에 보내도록 하겠습니다. RestAPI를 테스트 하기 위한 서버가 있으며 링크를 참고하시면 됩니다.
Android에서 요청할 테스트 서버는 REQRES에서 진행하도록 하겠습니다.(링크)
1. AndroidManifest.xml에서 인터넷사용 요청을 작성한다.
먼저 AndroidManifest.xml에 인터넷 접속 허가를 받아야 합니다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 인테넛 접속 허가를 받기 위한 코드-->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.RestAPI_Test"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
uses-permission에서 INTERNET사용 요청을 합니다.
2. build.grade.kts파일에 dependencies를 추가한다.
이 글에서는 Retrofit을 사용하기 때문에 implementotion에 해당 dependencies를 추가해야 합니다.
공식 사이트 : https://square.github.io/retrofit/
gitHub : https://github.com/square/retrofit
해당 API에서 JSON도 사용하기 때문에 2개의 dependencies를 받는다.
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
implementation("com.squareup.retrofit2:retrofit:2.9.0")
3. GET요청으로 한명의 유저정보 확인
![]() |
사진1) API Document |
사진1에서 SINGLE USER요청이 있는데 이것이 1명의 유저정보를 받기위한 API입니다.
먼저 이 유저 정보를 Android에서 어떻게 받을것인지를 정의해야 합니다.
GET SINGLE USER 정상 응답 샘플
"data": {
"id": 2,
"email": "janet.weaver@reqres.in",
"first_name": "Janet",
"last_name": "Weaver",
"avatar": "https://reqres.in/img/faces/2-image.jpg"
},
"support": {
"url": "https://reqres.in/#support-heading" ,
"text": "To keep ReqRes free, contributions towards server costs are appreciated!"
}
총 2개의 키값으로 나눠지는데 하나는 data 그리고 나머지는 support입니다. 이 안에서도 data는 id, email, first_name, last_name, avater로 key, value를 갖고 있고 support는 url과 text로 나눠집니다.
4. 응답값을 받는 Class를 만들기
1) UserSingleData Class 만들기 - data
먼저 클래스를 생성하고 data안에 있는 키와 값을 받을수 있는 클래스를 만들도록 하겠습니다.
package com.example.restapi_test;
public class UserSingleData {
// SINGLE USER의 응답에서 data부분의 요소들을 받을수 있는 class
class DataClass{
// data의 요소인 email, first_name, last_name, avater는 모두 String이기 때문에 String변수 하나고 정의
String email, first_name, last_name, avater;
// data의 요소중에서 유일하게 id는 숫자이다. 따라서 int로 정의한다.
int id;
}
}
작성을 완료한 다음에 Getter, Setter를 생성합니다.
![]() |
사진2) Getter, Setter설정 |
package com.example.restapi_test;
public class UserSingleData {
// SINGLE USER의 응답에서 data부분의 요소들을 받을수 있는 class
class DataClass{
// data의 요소인 email, first_name, last_name, avater는 모두 String이기 때문에 String변수 하나고 정의
String email, first_name, last_name, avater;
// data의 요소중에서 유일하게 id는 숫자이다. 따라서 int로 정의한다.
int id;
public String getEmail() {
return email;
}
public String getFirst_name() {
return first_name;
}
public String getLast_name() {
return last_name;
}
public String getAvater() {
return avater;
}
public int getId() {
return id;
}
public void setEmail(String email) {
this.email = email;
}
public void setFirst_name(String first_name) {
this.first_name = first_name;
}
public void setLast_name(String last_name) {
this.last_name = last_name;
}
public void setAvater(String avater) {
this.avater = avater;
}
public void setId(int id) {
this.id = id;
}
}
}
2) UserSingleData Class 만들기 - support
data와 마찬가지로 class를 생성해 줍니다. support의 두개의 키는 모두 String이기 때문에 아래와 같이 코드를 작성해 줍니다.
// SINGLE USER의 응답에서 support부부의 요소를 받을수 있는 class
class SupportClass{
// support의 두개의 키값은 모두 String이기 때문에 String변수로 정의한다.
String url, text;
public String getUrl() {
return url;
}
public String getText() {
return text;
}
public void setUrl(String url) {
this.url = url;
}
public void setText(String text) {
this.text = text;
}
}
그리고 클래스안에 동일하게 Getter, Setter를 작성합니다.
3) DataClass, SupportClass Getter, Setter만들기
DataClass data;
SupportClass support;
public DataClass getData() {
return data;
}
public SupportClass getSupport() {
return support;
}
public void setData(DataClass data) {
this.data = data;
}
public void setSupport(SupportClass support) {
this.support = support;
}
5. MainActivity에 응답값을 받을 interface 만들기
이제 MainActivity안에 지금까지 작성한 Class를 사용해야 합니다.
package com.example.restapi_test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Path;
public class MainActivity extends AppCompatActivity {
// 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);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
6. activity_main.xml을 수정하기
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<!-- 버튼을 누를시 API(GET)요청을 보낸다-->
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="164dp"
android:layout_marginTop="340dp"
android:text="Button"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--서버에서 응답반은 데이터를 표시한다.-->
<TextView
android:id="@+id/textView"
android:layout_width="309dp"
android:layout_height="124dp"
android:layout_marginStart="52dp"
android:layout_marginTop="140dp"
android:text="TextView"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!--조회할 유저 ID값을 입력한다.-->
<EditText
android:id="@+id/editTextNumber"
android:layout_width="105dp"
android:layout_height="43dp"
android:layout_marginStart="153dp"
android:layout_marginTop="280dp"
android:ems="10"
android:inputType="number"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
7. MainActivity에 Button, TextVIew, EditText 변수 생성하고 activity_main.xml여 연결하기
package com.example.restapi_test;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import retrofit2.Call;
import retrofit2.http.GET;
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);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// activity_main.xml의 View와 Java를 연결한다.
sendGetRequestBtn = findViewById(R.id.button);
responseData = findViewById(R.id.textView);
inputUserId = findViewById(R.id.editTextNumber);
}
}
8. Retrofit을 생성한다.
1) Builder 및 RequestUser변수를 생성한다.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// activity_main.xml의 View와 Java를 연결한다.
sendGetRequestBtn = findViewById(R.id.button);
responseData = findViewById(R.id.textView);
inputUserId = findViewById(R.id.editTextNumber);
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를 생성
}
9. Button을 누를시 API요청 및 Data를 출력하기
// 버튼을 클릭하면 발생할 이벤트 작성
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());
}
});
}
});
10 시연
위 동영상과 같이 GET요청을 서버에 하면 데이터를 받을수 있습니다.
gitHub : https://github.com/Alex-Choi0/android_excercise_api_request/tree/request_get
댓글
댓글 쓰기