이론/Android

Retrofit으로 안드로이드에서 데이터 받아오기

유세지 2017. 9. 30. 18:38



이번 글은  강좌를 참고하였습니다.



데이터 통신을 위해 retrofit 라이브러리를 사용해보았습니다. GET 방식과 POST 방식을 모두 이용해 보았지만 에러가 있는건지 POST 방식으로 받아 온 데이터는 다소 이상했습니다. 원인은 모르겠습니다.



클라이언트에서 서버( http://jsonplaceholder.typicode.com/ )에 있는 데이터를 두 가지 방식으로 받아온 뒤, Log로 콘솔창에 띄워줍니다. 데이터의 정확한 주소는 "/comment?postId=1" 입니다.






* 프로젝트 폴더 구성


- java 파일

ㄴ  ApiService.java (Interface)

ㄴ  MainActivity.java (Class)


- activity 파일

ㄴ  activity_main.xml



activity_main.xml 파일은 건드리지 않습니다. 화면에 표시할 목적이 아니라 콘솔창에서 로그로 데이터를 받아왔는지 확인만 할 것이기 때문에 굳이 텍스트등을 추가해 줄 필요가 없습니다.





* [Interface] ApiService.java 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.example.tcp.retrofitstudy;
 
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;
 
/**
* Created by tcp on 2017-09-27.
*/
 
public interface ApiService {
    public static final String API_URL = "http://jsonplaceholder.typicode.com/";
 
    @GET ("comments")
    Call<ResponseBody>getComment(@Query("postId"int postId);
 
    @POST ("comments")
    Call<ResponseBody>getPostComment(@Query("postId"int postId);
 
 
    // String version
 
    @GET ("comments")
    Call<ResponseBody>getCommentStr(@Query("postId"String postId);
 
    @FormUrlEncoded
    @POST ("comments")
    Call<ResponseBody>getPostCommentStr(@Field("postId"String postId);
}
cs




 - @GET ("comments")

여기서 @GET은 데이터 송수신 방식으로, @GET이나 @POST 등으로 사용할 수 있습니다.

("comments") 는 API_URL 뒤에 붙어서 주소창에 나오는... api의 주소라고 하는데 정확히는 모르겠습니다.


 - Call<ResponseBody>getComment(@Query("postId") int postId);

getComment 부분이 함수의 이름, @Query("postId") 이 쿼리 부분입니다. " " 안쪽 부분이 변수 이름, int postId 부분이 안드로이드에서 보내는 변수의 이름입니다. 위쪽의 두 개는 int형으로 보냈고 아래쪽의 두 개는 String 형으로 보냈습니다.





* [Class] MainActivity.java 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
package com.example.tcp.retrofitstudy;
 
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
 
import java.io.IOException;
 
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
 
public class MainActivity extends AppCompatActivity {
    Retrofit retrofit;
    ApiService apiService;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        retrofit = new Retrofit.Builder().baseUrl(ApiService.API_URL).build();
        apiService = retrofit.create(ApiService.class);
 
 
        // get 방식
 
        Call<ResponseBody> comment = apiService.getComment(1);
        comment.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.v("Test", response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
 
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
 
            }
        });
 
 
        // post 방식
 
        Call<ResponseBody> comment2 = apiService.getPostComment(1);
        comment2.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.v("Test2", response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
 
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
 
            }
        });
 
        // String version
 
        Call<ResponseBody> commentStr = apiService.getCommentStr("2");
        commentStr.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.v("Test3", response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
 
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
 
            }
        });
 
        Call<ResponseBody> postCommentStr = apiService.getPostCommentStr("2");
        postCommentStr.enqueue(new Callback<ResponseBody>() {
            @Override
            public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
                try {
                    Log.v("Test4", response.body().string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
 
            @Override
            public void onFailure(Call<ResponseBody> call, Throwable t) {
 
            }
        });
 
 
    }
}
cs



retrofit 을 사용하기 위해 Retrofit retrofit; 을 선언해주고, 위에서 만든 인터페이스를 사용하기 위해 ApiService도 선언합니다.

통신에 성공하게 되면 onResponse 의 try 문 안 쪽의 Log.v 가 실행됩니다. 실패하게 된다면 onFailure 가 실행되고, 예외가 발생했다면 catch 문에서 걸리게 될 것 같고...





이제 실행 결과를 보겠습니다. 먼저 프로그램을 정상적으로 실행했을때 얻을 수 있는 결과 값을 살펴보겠습니다.

주소창에 직접 "http://jsonplaceholder.typicode.com/comments?postId=1" 를 입력해 본 결과입니다.






이제 이 데이터들을 콘솔창에서도 볼 수 있는지 확인하여 보겠습니다.







 Test 1 : GET 방식, int 형 변수로 받아오기.

 Test 2 : POST 방식, int 형 변수로 받아오기.

 Test 3 : GET 방식, String 형 변수로 받아오기.

 Test 4 : POST 방식, String 형 변수로 받아오기.




GET 방식으로 받아온 데이터는 int / String 모두 정상적으로 출력이 되는 것을 확인할 수 있었습니다. 다만 POST 방식으로 받아온 데이터는 "id = 501" 이라는 값만 출력하는데 이게 정상인지 오류인지 모르겠네요. 오늘 스터디는 여기까지.



+ 정상인듯 하네요. 저 데이터가 의미하는건 모르겠지만 서버쪽에서 보내주는 데이터는 저게 맞습니다.

반응형