[Project Glue] 어떻게 Rest API를 썼을까? (하)
728x90
반응형

자. 앞 얘기를 계속해보자.


1
2
final Call<HomeData> response 
    = ListRestAdapter.getInstance().createGroupData(authorization, imgMap);
cs


하나씩 살펴보자. ( AddGroupPresenterImpl.java )

위 소스에서 네트워크를 연결한다. 그렇다면 createGroupData를 이해해야한다.

아래는 ListRestAdapter 소스이다.


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
public class ListRestAdapter {
    /** 생략 **/
    private static OkHttpClient client;
    private static IServerData service;
 
    public synchronized static IServerData getInstance(){
        if(service == null) {
            // 통신 로그를 확인하기 위한 interceptor 설정
            HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
            interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
 
            // OK HTTP 설정
            // SSL 통한 서버연결인 경우 인증서가 없으면 통신자체가 안된다.
            // 이럴 경우 우회하기 위한 인증서를 무시하는 셋팅.
            client = configureClient(new OkHttpClient().newBuilder())
                    .connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS)
                    .writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS)
                    .readTimeout(READ_TIMEOUT, TimeUnit.SECONDS)
                    .cookieJar(new JavaNetCookieJar(manager)) //쿠키 저장
                    .addInterceptor(interceptor) // 로그를 출력(디버깅용)
                    .build();
 
            // Retrofit 설정
            service = new Retrofit.Builder()
                    .baseUrl(Networking.getBASE_URL())
                    .client(client)
                    // json 응답 변환. Json Parser 추가
                    .addConverterFactory(GsonConverterFactory.create()) 
                    .build().create(IServerHomeData.class); //인터페이스 연결
        }
        return service;
    }
 
    /**  OkHttpClient.Builder  **/ 
 
}
cs


getInstance가 통신을 하기 위한 세팅을 한다.

service가 createGroupData를 인터페이스에서 부른다.

이 인터페이스는 IServerHomeData에 구현되어 있다.

IServerHomeData에 구현된 createGroupData는 아래와 같다.


1
2
3
4
5
6
7
// 구룹 생성
@Multipart
@POST("/group/group_list/")
Call<HomeData> createGroupData(
    @Header("Authorization"String authorization,
    @PartMap Map<String, RequestBody> group_image
);
cs


여기서 나온다. Rest API를 구성하는 세가지.

자원(RESOURCE) - URI : /group/group_list/

행위(Verb) - HTTP METHOD : @POST

표현(Representations) : 그 아래 전부

Multipart에 관해서는 retrofit api 문서(한글)를 참고하도록 하자.

이렇게 service를 통해 서버에 접근을 하게 된다.

이렇게 서버에 접근할 수 있는 Call 객체를 만들고 나면 Callback을 구현해야한다.

다시 구현 소스를 살펴보자. ( AddGroupPresenterImpl.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
final Call<HomeData> response 
    = ListRestAdapter.getInstance().createGroupData(authorization, imgMap);
 
response.enqueue(new Callback<HomeData>() {
    @Override
    public void onResponse(Call<HomeData> call, Response<HomeData> response) {
        view.addGroupResult(response.code());
        if(response.isSuccessful()){
            Toast.makeText(context, "Add Group : Successful"
                           Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(context, "Add Group : Fail"
                           Toast.LENGTH_SHORT).show();
        }
        view.addGroupFinish();
        progress.dismiss();
    }
 
    @Override
    public void onFailure(Call<HomeData> call, Throwable t) {
        view.addGroupFinish();
        progress.dismiss();
    }
});
cs


Call 객체가 수행한 enqueue은 비동기식으로 사용하기 위한 메서드 입니다. (realm 홈페이지 참고)

이 메서드에 딸려오는 onResponse와 onFailure. 

각각 응답에 성공했을 때와 실패했을 때 수행할 일을 정의하면 된다. (태환님 블로그 참고)

addGroupResult는 상태 코드를 받아와서 체크하는 것이다. (200, 404, 500 등)


이렇게 그룹 추가 요청을 하게 된다.

다른 식으로 Rest API를 설명한 자료는 아래에 링크로 남겼다.

참고가 되길 바란다. 

(정말 유레카 같은 자료들. 모두 정독하길 추천!!)

mizzo 블로그 : https://goo.gl/kPTPr6

이대엽님 번역 글 : https://goo.gl/ODXGQv

NHN엔터테인먼트 기술블로그 : http://meetup.toast.com/posts/92

fresco : https://goo.gl/NSS8xV

[번역] Android 통신 라이브러리의 역사를 되돌아본다



728x90
반응형