Android Open Source - kakao-android-sdk-standalone A P I Http Request Task






From Project

Back to project page kakao-android-sdk-standalone.

License

The source code is released under:

Apache License

If you think the Android project kakao-android-sdk-standalone listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/**
 * Copyright 2014 Minyoung Jeong <kkungkkung@gmail.com>
 * Copyright 2014 Kakao Corp./*from  ww  w  .  ja va 2s .com*/
 *
 * Redistribution and modification in source or binary forms are not permitted without specific prior written permission.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.kakao.rest;

import android.os.Message;
import com.kakao.APIErrorResult;
import com.kakao.Session;
import com.kakao.SessionCallback;
import com.kakao.exception.KakaoException;
import com.kakao.helper.ServerProtocol;
import com.kakao.http.HttpRequestBuilder;
import com.kakao.http.HttpRequestTask;
import com.kakao.http.HttpResponseHandler;
import com.kakao.http.HttpTaskManager;
import com.kakao.http.KakaoAsyncHandler;
import com.kakao.http.Request;
import com.kakao.http.Response;

import org.apache.http.HttpStatus;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.net.URI;
import java.util.Map;
import java.util.Map.Entry;

/**
 * API ????? ?? HttpRequestTask? ?? ??? ????? ??????,
 * ?? ???? ???? ?? APIErrorResult ???? ???????? ??.
 * @param <T> : ????? ??? ?? return ??? type. HttpResponseHandler<T>, Class<T>
 * @author MJ
 */
public class APIHttpRequestTask<T> extends HttpRequestTask<T> {
    private final HttpResponseHandler<T> HttpResponseHandler;

    public APIHttpRequestTask(final Request request, final HttpResponseHandler<T> httpResponseHandler, final Class<T> returnType) {
        super(request, new APIAsyncHandler<T>(request, httpResponseHandler, returnType));
        this.HttpResponseHandler = httpResponseHandler;
    }

    public static void checkSessionAndExecute(final APIHttpRequestTask requestTask, final HttpResponseHandler responseHandler) {
        if (Session.getCurrentSession().isOpened())
            HttpTaskManager.execute(requestTask);
        else if (!requestAccessTokenWithRefreshToken(requestTask, responseHandler)) {
            failedToRefreshAccessToken(requestTask, responseHandler, "session is closed before sending the request");
        }
    }

    private static void failedToRefreshAccessToken(final APIHttpRequestTask requestTask, final HttpResponseHandler responseHandler, final String errorMsg) {
        String requestUrl = null;
        if(requestTask != null && requestTask.request != null)
            requestUrl = requestTask.request.getUrl();
        final APIErrorResult clientError = new APIErrorResult(requestUrl, errorMsg);
        responseHandler.sendMessage(Message.obtain(responseHandler, NEED_TO_LOGIN, 0, 0, clientError));
    }

    public static void addQueryParam(final HttpRequestBuilder requestBuilder, final String propertiesKey, final Map properties) throws JSONException {
        JSONObject json = new JSONObject();
        for (Object key : properties.keySet()) {
            json.put((String)key, properties.get(key));
        }

        requestBuilder.addQueryParameter(propertiesKey, json.toString());
    }

    private static class APIAsyncHandler<T> extends KakaoAsyncHandler<T> {

        public APIAsyncHandler(final Request request, final HttpResponseHandler<T> httpResponseHandler, final Class<T> returnType) {
            super(request, httpResponseHandler, returnType);
        }

        protected Void handleFailureHttpStatus(final Response response, final URI requestUri, final int httpStatusCode) throws IOException {
            switch (httpStatusCode) {
                case HttpStatus.SC_UNAUTHORIZED:
                    requestAccessTokenWithRefreshToken(new APIHttpRequestTask<T>(request, httpResponseHandler, returnType), httpResponseHandler);
                    return null;
                case HttpStatus.SC_BAD_REQUEST:
                case HttpStatus.SC_FORBIDDEN:
                case HttpStatus.SC_INTERNAL_SERVER_ERROR:
                    if (checkResponseBody(response)) return null;

                    JSONObject json = null;
                    try {
                        json = new JSONObject(response.getResponseBody());
                        final APIErrorResult result =  new APIErrorResult(
                                json.getInt("code"),
                                json.getString("msg")
                        );
                        result.setRequestURL(requestUri == null ? null : requestUri.toString());
                        httpResponseHandler.sendMessage(Message.obtain(httpResponseHandler, ERROR, 0, 0, result));
                    } catch (JSONException e) {
                        httpResponseHandler.sendMessage(Message.obtain(httpResponseHandler, ERROR, 0, 0, e));
                    }
                    return null;
                default:
                    sendError(response, "not expected http status");
                    return null;
            }
        }
    }

    private static boolean requestAccessTokenWithRefreshToken(final APIHttpRequestTask requestTask, final HttpResponseHandler responseHandler) {
        return Session.getCurrentSession().implicitOpen(new SessionCallback() {
            @Override
            public void onSessionOpened() {
                HttpTaskManager.execute(requestTask.updateSession());
            }

            @Override
            public void onSessionClosed(final KakaoException exception) {
                failedToRefreshAccessToken(requestTask, responseHandler, "session is closed during refreshing token for the request");
            }
        });
    }

    private HttpRequestTask updateSession() {
        request.getHeaders().put(ServerProtocol.AUTHORIZATION_HEADER_KEY, getAuthHeaderValue());
        return this;
    }

    protected void preRequest() {
        HttpResponseHandler.sendMessage(Message.obtain(HttpResponseHandler, -1, 0, 0));
    }

    protected void failedRequest(Exception e) {
        HttpResponseHandler.sendMessage(Message.obtain(HttpResponseHandler, ERROR, 0, 0, e));
    }

    public static void addCommon(final HttpRequestBuilder requestBuilder) {
        final Entry<String,String> entry = KA_HEADER.entrySet().iterator().next();
        requestBuilder.addHeader(entry.getKey(), entry.getValue());
        requestBuilder.addHeader(ServerProtocol.AUTHORIZATION_HEADER_KEY, getAuthHeaderValue());
    }

    private static String getAuthHeaderValue() {
        final StringBuilder autorizationValue = new StringBuilder();
        autorizationValue.append(ServerProtocol.AUTHORIZATION_BEARER).append(" ").append(Session.getCurrentSession().getAccessToken());
        return autorizationValue.toString();
    }
}




Java Source Code List

com.kakao.APIErrorResult.java
com.kakao.AppActionBuilder.java
com.kakao.ErrorCode.java
com.kakao.KakaoLinkParseException.java
com.kakao.KakaoLink.java
com.kakao.KakaoStoryHttpResponseHandler.java
com.kakao.KakaoStoryPostParamBuilder.java
com.kakao.KakaoStoryProfile.java
com.kakao.KakaoStoryService.java
com.kakao.KakaoStoryUpload.java
com.kakao.KakaoTalkHttpResponseHandler.java
com.kakao.KakaoTalkLinkMessageBuilder.java
com.kakao.KakaoTalkProfile.java
com.kakao.KakaoTalkService.java
com.kakao.LoginActivity.java
com.kakao.LogoutResponseCallback.java
com.kakao.MeResponseCallback.java
com.kakao.SessionCallback.java
com.kakao.Session.java
com.kakao.SignupResponseCallback.java
com.kakao.UnlinkResponseCallback.java
com.kakao.UpdateProfileResponseCallback.java
com.kakao.UserManagement.java
com.kakao.UserProfileResponseCallback.java
com.kakao.UserProfile.java
com.kakao.UserResponseCallback.java
com.kakao.User.java
com.kakao.authorization.AuthorizationResult.java
com.kakao.authorization.Authorizer.java
com.kakao.authorization.accesstoken.AccessTokenRequest.java
com.kakao.authorization.accesstoken.AccessToken.java
com.kakao.authorization.accesstoken.GetterAccessToken.java
com.kakao.authorization.accesstoken.package-info.java
com.kakao.authorization.authcode.AuthorizationCodeHandler.java
com.kakao.authorization.authcode.AuthorizationCodeRequest.java
com.kakao.authorization.authcode.AuthorizationCode.java
com.kakao.authorization.authcode.GetterAuthorizationCode.java
com.kakao.authorization.authcode.KakaoWebViewDialog.java
com.kakao.authorization.authcode.LoggedInTalkAuthHandler.java
com.kakao.authorization.authcode.LoggedOutTalkAuthHandler.java
com.kakao.authorization.authcode.OnWebViewCompleteListener.java
com.kakao.authorization.authcode.WebViewAuthHandler.java
com.kakao.authorization.authcode.package-info.java
com.kakao.exception.KakaoException.java
com.kakao.exception.KakaoWebviewException.java
com.kakao.exception.package-info.java
com.kakao.helper.Base64.java
com.kakao.helper.JsonHelper.java
com.kakao.helper.Logger.java
com.kakao.helper.ServerProtocol.java
com.kakao.helper.SharedPreferencesCache.java
com.kakao.helper.SystemInfo.java
com.kakao.helper.TalkProtocol.java
com.kakao.helper.Utility.java
com.kakao.helper.package-info.java
com.kakao.http.AsyncHttpClient.java
com.kakao.http.BodyPart.java
com.kakao.http.FilePart.java
com.kakao.http.HttpRequestBuilder.java
com.kakao.http.HttpRequestTask.java
com.kakao.http.HttpResponseHandler.java
com.kakao.http.HttpTaskManager.java
com.kakao.http.KakaoAsyncHandler.java
com.kakao.http.Multipart.java
com.kakao.http.Request.java
com.kakao.http.Response.java
com.kakao.http.package-info.java
com.kakao.internal.ActionInfo.java
com.kakao.internal.Action.java
com.kakao.internal.KakaoTalkLinkProtocol.java
com.kakao.internal.LinkObject.java
com.kakao.internal.package-info.java
com.kakao.rest.APIHttpRequestTask.java
com.kakao.rest.package-info.java
com.kakao.sample.kakaolink.KakaoLinkMainActivity.java
com.kakao.sample.kakaolink.KakaoLinkSplashActivity.java
com.kakao.sample.kakaolink.package-info.java
com.kakao.sample.kakaostory.KakaoStoryLoginActivity.java
com.kakao.sample.kakaostory.KakaoStoryMainActivity.java
com.kakao.sample.kakaostory.KakaoStorySignupActivity.java
com.kakao.sample.kakaostory.package-info.java
com.kakao.sample.kakaotalk.KakaoTalkLoginActivity.java
com.kakao.sample.kakaotalk.KakaoTalkMainActivity.java
com.kakao.sample.kakaotalk.KakaoTalkSignupActivity.java
com.kakao.sample.kakaotalk.package-info.java
com.kakao.sample.usermgmt.ExtraUserPropertyLayout.java
com.kakao.sample.usermgmt.UserMgmtLoginActivity.java
com.kakao.sample.usermgmt.UsermgmtMainActivity.java
com.kakao.sample.usermgmt.UsermgmtSignupActivity.java
com.kakao.sample.usermgmt.package-info.java
com.kakao.template.loginbase.SampleLoginActivity.java
com.kakao.template.loginbase.SampleSignupActivity.java
com.kakao.template.loginbase.package-info.java
com.kakao.template.loginfree.LoginFreeTemplateActivity.java
com.kakao.template.loginfree.package-info.java
com.kakao.widget.LoginButton.java
com.kakao.widget.ProfileLayout.java
com.kakao.widget.package-info.java
com.kakao.package-info.java