/* * Copyright 2014 sonaive.com. All rights reserved. * * 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.sonaive.v2ex.sync.api; import android.content.Context; import android.os.Bundle; import com.google.gson.Gson; import com.sonaive.v2ex.sync.V2exDataHandler; import com.squareup.okhttp.FormEncodingBuilder; import com.squareup.okhttp.OkHttpClient; import com.squareup.okhttp.Request; import com.squareup.okhttp.RequestBody; import com.squareup.okhttp.Response; import com.squareup.okhttp.internal.http.HttpMethod; import org.apache.http.protocol.HTTP; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import static com.sonaive.v2ex.util.LogUtils.LOGD; import static com.sonaive.v2ex.util.LogUtils.LOGW; import static com.sonaive.v2ex.util.LogUtils.makeLogTag; /** * Created by liutao on 12/6/14. */ public class Api { private static final String TAG = makeLogTag(Api.class); public static final String ARG_TYPE = "arg_type"; public static final String ARG_RESULT = "arg_result"; // public static final String ARG_API_PARAMS_ID = "arg_params_id"; public static final String ARG_API_NAME = "arg_api_name"; public static final String ARG_API_PARAMS = "arg_params"; public static final String API_HOST_URL = "http://www.v2ex.com"; public static final String API_TOPICS_LATEST = "/api/topics/latest.json"; public static final String API_TOPICS_HOT = "/api/topics/hot.json"; public static final String API_TOPICS_SPECIFIC = "/api/topics/show.json"; public static final String API_NODES_ALL = "/api/nodes/all.json"; public static final String API_NODES_SPECIFIC = "/api/nodes/show.json"; public static final String API_REVIEWS = "/api/replies/show.json"; public static final String API_MEMBER = "/members/show.json"; public static final String API_SIGNIN = "/signin"; public static final String API_MY_NODES = "/my/nodes"; public static final String API_USER_IDENTITY = "/api/members/show.json"; public static Map<String, String> API_URLS = new HashMap<>(); static { API_URLS.put(API_TOPICS_LATEST, API_HOST_URL + API_TOPICS_LATEST); API_URLS.put(API_TOPICS_HOT, API_HOST_URL + API_TOPICS_HOT); API_URLS.put(API_TOPICS_SPECIFIC, API_HOST_URL + API_TOPICS_SPECIFIC); API_URLS.put(API_NODES_ALL, API_HOST_URL + API_NODES_ALL); API_URLS.put(API_NODES_SPECIFIC, API_HOST_URL + API_NODES_SPECIFIC); API_URLS.put(API_REVIEWS, API_HOST_URL + API_REVIEWS); API_URLS.put(API_MEMBER, API_HOST_URL + API_MEMBER); API_URLS.put(API_SIGNIN, API_HOST_URL + API_SIGNIN); API_URLS.put(API_MY_NODES, API_HOST_URL + API_MY_NODES); API_URLS.put(API_USER_IDENTITY, API_HOST_URL + API_USER_IDENTITY); } protected Context mContext; protected String mUrl; protected Bundle mArguments; public enum HttpMethod { GET, POST } public Api(Context context, Bundle params, String api) { mContext = context; if (params != null) { mArguments = params; } else { mArguments = new Bundle(); } mUrl = Api.API_URLS.get(api); } public Api(Context context, Bundle params, String api, String dataKey) { mContext = context; if (params != null) { mArguments = params; } else { mArguments = new Bundle(); } mArguments.putString(V2exDataHandler.ARG_DATA_KEY, dataKey); mUrl = Api.API_URLS.get(api); } public Bundle sync(HttpMethod httpMethod) { OkHttpClient okHttpClient = new OkHttpClient(); okHttpClient.setConnectTimeout(15, TimeUnit.SECONDS); okHttpClient.setReadTimeout(15, TimeUnit.SECONDS); Request request = null; HashMap params = null; String json = mArguments.getString(ARG_API_PARAMS); if (httpMethod == HttpMethod.GET) { if (json != null) { params = new Gson().fromJson(json, HashMap.class); StringBuilder builder = new StringBuilder(mUrl).append("?"); for (Map.Entry<String, String> entry : ((HashMap<String, String>) params).entrySet()) { builder.append(entry.getKey()).append("=").append(entry.getValue()).append("&"); } builder.deleteCharAt(builder.length() - 1); mUrl = builder.toString(); } request = new Request.Builder() .url(mUrl) .build(); } else { FormEncodingBuilder formBodyBuilder = new FormEncodingBuilder(); if (json != null) { params = new Gson().fromJson(json, HashMap.class); for (Map.Entry<String, String> entry : ((HashMap<String, String>) params).entrySet()) { formBodyBuilder.add(entry.getKey(), entry.getValue()); } } RequestBody formBody = formBodyBuilder.build(); request = new Request.Builder() .url(mUrl) .post(formBody) .build(); } try { Response response = okHttpClient.newCall(request).execute(); if (response != null && response.code() == 200) { LOGD(TAG, "Request: " + mUrl + ", server returned HTTP_OK, so fetching was successful."); mArguments.putString(Api.ARG_RESULT, response.body().string()); return mArguments; } else if (response != null && response.code() == 403) { LOGW(TAG, "Request: " + mUrl + ", Server returned 403, fetching was failed."); } else { LOGW(TAG, "Request: " + mUrl + ", Fetching was failed. Unknown reason"); } } catch (IOException e) { e.printStackTrace(); } return null; } }