brunch

You can make anything
by writing

C.S.Lewis

by 윤형도 Jun 29. 2016

빠르게 배우는 안드로이드-24 retrofit-http

retrofit을 이용한 http통신( retrofit-1)


앱을 만들다보면 서버에 있는 정보를 이용해야 합니다.

이번 시간에는 square사의 retrofit이라는 라이브러리를 이용해서 http통신을해보겠습니다.

retrofit에 대한 자세한 내용은 http://square.github.io/retrofit/ 에서 살펴보실수 있습니다.

우선 http 통신에 대한 간단한 설명하고 시작하겠습니다.

http통신은 웹 즉 인터넷에 있는 정보를 가져오는 작업이라고 생각하시면 쉽습니다.

그렇다면 원하는 데이터를 입력하하고 가져오기 위해서는 변수를 넘겨주어야겠지요

변수를 넘기는 방법이 get과 post 2가지 방법이있습니다.

get과 post 방법이 나누어 져있는 이유는 쉽게 설명하면

get은 변수가 눈에 보입니다.

post는 눈에 보이지 않습니다로 생각할수있습니다.

get 방식은 google, naver 등에 검색어를 검색하면 주소창에

https://search.naver.com/search.naver?where=nexearch&query=안드로이드&sm=top_hty&fbm=1&ie=utf8

이런식으로 표시가 될텐데요 기본 주소 뒤에 ?where=nexearch , &query= 안드로이드 이런식으로 변수를 넘겨주는것입니다.

(기본주소 바로뒤 변수이름에는 ?를 붙이고 이후의 변수이름들에는 &를 붙여서 여러 데이터를 전송할수있습니다.)

post방식은 주소에 변수가 노출이되면 보안상 취약할수있기때문에 보이지 않게 보내주는것이라고 생각하면됩니다.

retrofit에서 get과 post를 간단하게 실습해보도록하겠습니다.

그렇다면 get과 post로 데이터를 가져올 샘플이 필요하겠죠
 그래서 http://jsonplaceholder.typicode.com/ 를 이용할것입니다.

이제 실습을 해보도록하겠습니다.

프로젝트를 만들고 gradle Scrips에 build.gradle(Module:app) 파일을 열어줍니다.    

dependencies 부분에

compile 'com.squareup.retrofit2:retrofit:2.1.0'

을 추가해줍니다.    

상단에 Sync Now 버튼을 누르면 retrofit라이브러리를 안드로이드 스튜디오가 받아옵니다.

첫번째로

http://jsonplaceholder.typicode.com/comments?postId=1

를 받아오도록해봅시다.

postId가 변수이름이고 값은 1입니다.

ApiService라는 interface 를 만들어보도록합시다.    

API_URL이라는 상수를 만들어 서버주소를 적어줍니다.

public static final String API_URL = "http://jsonplaceholder.typicode.com/";

이제 get을 실습해보겠습니다.

@GET(“api주소”)
Call<ResponseBody>함수이름(@Query(“변수이름”), 안드로이드에서 보낼 변수)

위와 같은 방법으로 사용하게됩니다.

저희의 주소에 맞게 코드를 바꾸면 이렇게 됩니다.

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

전체코드

package tispoon.me.retrofittest;

import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;

/**
 * Created by Yoon on 2016-06-29.
 */
public interface ApiService {
    public static final String API_URL = "http://jsonplaceholder.typicode.com/";

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

}


이제 MainActivity로 이동하여 만든 메소드를 사용하여 데이터를 불러보도록합시다.

Retrofit 과ApiService를 필드로 생성하고 아래와 같이 코드를 입력해줍니다.

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);
        

    }
}

이제 저희가 할것은 apiService에 .(점) 을 찍어보면    

우리가 만든 getComment라는 메소드가 나옵니다

우선 postId에 1을 넣어봅시다.

apiService.getComment(1);

apiService를 클릭하고 잠시기다리면 전구모양 아이이 등장합니다.

introduce local variable을 선택합니다.

다음과 같은 코드를 만들어줍니다.

Call<ResponseBody> comment = apiService.getComment(1);

이렇게하면 준비가 끝납니다.    

comment.enqueue를 선택하고 다음과 같은 코드를 완성해줍시다

comment.enqueue(new Callback<ResponseBody>() {
    @Override
    public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
        
    }

    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {

    }
});

이제 데이터가 받아지면 onResponse메소드가 호출되고

실패하면 onFailure 메소드가 호출됩니다.

데이터를 확인하기 위하여

onResponse함수안에 다음과같은 코드를 적어줍니다.

response.body().string()

이 코드를 통해서 받아온 데이터를 확인할수있습니다.

따라서 저희는 Log를 이용하여 확인해봅시다.    

response.body().string()부분에 빨간표시가 되있는것을 알수있는데

그 부분을 클릭하면 빨간 전구가 나옵니다.

빨간전구를 클릭하여 Surround with try/catch를 추가해줍니다    

완성코드    

코드는 다 완성되었지만 안드로이드기기는 인터넷을 사용할때 manifest에 permission을 추가해 주어야합니다.

manifests를 클릭하여 manifests파일을 열어줍니다.

다음과 같은 방법을 통해서internet permission을 추가해줍니다    

완성된 manifest코드    

이제 실행을하여 결과를 확인해보면 로그창에 데이터가 나오는것을 확인할수있습니다.    


로그 내용

04-25 14:03:02.670 3655-3655/com.test.henen.myapplication V/Test: {

                                                                    "id": 501

                                                                  }

04-25 14:03:02.747 3655-3655/com.test.henen.myapplication V/Test: [

                                                                    {

                                                                      "postId": 1,

                                                                      "id": 1,

                                                                      "name": "id labore ex et quam laborum",

                                                                      "email": "Eliseo@gardner.biz",

                                                                      "body": "laudantium enim quasi est quidem magnam voluptate ipsam eos\ntempora quo necessitatibus\ndolor quam autem quasi\nreiciendis et nam sapiente accusantium"

                                                                    },

                                                                    {

                                                                      "postId": 1,

                                                                      "id": 2,

                                                                      "name": "quo vero reiciendis velit similique earum",

                                                                      "email": "Jayne_Kuhic@sydney.com",

                                                                      "body": "est natus enim nihil est dolore omnis voluptatem numquam\net omnis occaecati quod ullam at\nvoluptatem error expedita pariatur\nnihil sint nostrum voluptatem reiciendis et"

                                                                    },

                                                                    {

                                                                      "postId": 1,

                                                                      "id": 3,

                                                                      "name": "odio adipisci rerum aut animi",

                                                                      "email": "Nikita@garfield.biz",

                                                                      "body": "quia molestiae reprehenderit quasi aspernatur\naut expedita occaecati aliquam eveniet laudantium\nomnis quibusdam delectus saepe quia accusamus maiores nam est\ncum et ducimus et vero voluptates excepturi deleniti ratione"

                                                                    },

                                                                    {

                                                                      "postId": 1,

                                                                      "id": 4,

                                                                      "name": "alias odio sit",

                                                                      "email": "Lew@alysha.tv",

                                                                      "body": "non et atque\noccaecati deserunt quas accusantium unde odit nobis qui voluptatem\nquia voluptas consequuntur itaque dolor\net qui rerum deleniti ut occaecati"

                                                                    },

                                                                    {

                                                                      "postId": 1,

                                                                      "id": 5,

                                                                      "name": "vero eaque aliquid doloribus et culpa",

                                                                      "email": "Hayden@althea.biz",

                                                                      "body": "harum non quasi et ratione\ntempore iure ex voluptates in ratione\nharum architecto fugit inventore cupiditate\nvoluptates magni quo et"

                                                                    }

                                                                  ]




그렇다면 post는 어떻게 해야할까요?

post또한 비슷합니다

apiService 클래스에

@POST("comments")
Call<ResponseBody>getPostComment(@Query("postId") int postId);

함수를 추가하고

MainActivity에서 했던과정을 반복하여 함수를 실행하면 post를 사용할수있습니다.

package tispoon.me.retrofittest;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
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(2);
        comment2.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) {

            }
        });

    }
}

변수로 int 형을 넘겨주었기때문에 @POST, @GET 의 Annotaion만 바뀐 형태로 사용할수있었는데요 String을 넘겨주면 약간 다르게됩니다.

ApiService interface로 이동하여 GET과 POST를 int 가 아닌 String으로 바꾸어 전송하는 코드를 작성해보겠습니다.    

String을 보내는 버전에서는 Get으로 보내는 것은 int 와 다르지 않지만

POST로 보낼때는 @FormUrlEncoded를 추가하고

@Query가 아닌 @Field 로 코드가 바뀌어져서 사용합니다.

MainActivity에서 호출되서 사용하는 방법은 전과 동일합니다.    

다음번에는 retrofit을 통해서 json 형식의 데이터를 쉽게 받아오는것을 알아보도록하겠습니다.

매거진의 이전글 빠르게 배우는 안드로이드 -23 Fragment-4
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari