본문 바로가기
이론/Android

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

by 유세지 2017. 9. 30.



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



데이터 통신을 위해 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" 이라는 값만 출력하는데 이게 정상인지 오류인지 모르겠네요. 오늘 스터디는 여기까지.



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

반응형

'이론 > Android' 카테고리의 다른 글

웹 페이지 파싱 on Android (Jsoup 이용)  (1) 2017.12.01

댓글