데이터 통신을 위해 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 |
---|
댓글