package com.yuzhi.fine.http; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.text.TextUtils; import android.util.Base64; import android.util.Log; import android.widget.Toast; import com.alibaba.fastjson.JSON; import com.yuzhi.fine.R; import com.yuzhi.fine.common.AppContext; import com.yuzhi.fine.model.SearchParam; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Interceptor; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; /** * Created by tiansj on 15/2/27. */ public class HttpClient { private static final int CONNECT_TIME_OUT = 10; private static final int WRITE_TIME_OUT = 60; private static final int READ_TIME_OUT = 60; private static final int MAX_REQUESTS_PER_HOST = 10; private static final String TAG = HttpClient.class.getSimpleName(); private static final String UTF_8 = "UTF-8"; private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain;"); private static OkHttpClient client; static { OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.connectTimeout(CONNECT_TIME_OUT, TimeUnit.SECONDS); builder.writeTimeout(WRITE_TIME_OUT, TimeUnit.SECONDS); builder.readTimeout(READ_TIME_OUT, TimeUnit.SECONDS); builder.networkInterceptors().add(new LoggingInterceptor()); client = builder.build(); client.dispatcher().setMaxRequestsPerHost(MAX_REQUESTS_PER_HOST); } static class LoggingInterceptor implements Interceptor { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Request request = chain.request(); long t1 = System.nanoTime(); Log.i(TAG, String.format("Sending request %s on %s%n%s", request.url(), chain.connection(), request.headers())); Response response = chain.proceed(request); long t2 = System.nanoTime(); Log.i(TAG, String.format("Received response for %s in %.1fms%n%s", response.request().url(), (t2 - t1) / 1e6d, response.headers())); return response; } } public static boolean isNetworkAvailable() { try { ConnectivityManager connectivityManager = (ConnectivityManager) AppContext.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); return networkInfo != null && networkInfo.isAvailable() && networkInfo.isConnected(); } catch (Exception e) { Log.v("ConnectivityManager", e.getMessage()); } return false; } public static void get(String url, Map<String, String> param, final HttpResponseHandler handler) { if (!isNetworkAvailable()) { Toast.makeText(AppContext.getInstance(), R.string.no_network_connection_toast, Toast.LENGTH_SHORT).show(); return; } if(param != null && param.size() > 0) { url = url + "?" + mapToQueryString(param); } Request request = new Request.Builder().url(url).build(); client.newCall(request).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { try { RestApiResponse apiResponse = getRestApiResponse(response.body().toString()); handler.sendSuccessMessage(apiResponse); } catch (Exception e) { handler.sendFailureMessage(call.request(), e); } } @Override public void onFailure(Call call, IOException e) { handler.sendFailureMessage(call.request(), e); } }); } public static void post(String url, Map<String, String> param, final HttpResponseHandler handler) { if (!isNetworkAvailable()) { Toast.makeText(AppContext.getInstance(), R.string.no_network_connection_toast, Toast.LENGTH_SHORT).show(); return; } String paramStr = ""; if(param != null && param.size() > 0) { paramStr = url += mapToQueryString(param);; url = url + "?" + paramStr; } RequestBody body = RequestBody.create(MEDIA_TYPE, paramStr); Request request = new Request.Builder().url(url).post(body).build(); client.newCall(request).enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { try { RestApiResponse apiResponse = getRestApiResponse(response.body().toString()); handler.sendSuccessMessage(apiResponse); } catch (Exception e) { handler.sendFailureMessage(call.request(), e); } } @Override public void onFailure(Call call, IOException e) { handler.sendFailureMessage(call.request(), e); } }); } private static RestApiResponse getRestApiResponse(String responseBody) throws Exception { if(!isJsonString(responseBody)) { throw new Exception("server response not json string (response = " + responseBody + ")"); } RestApiResponse apiResponse = JSON.parseObject(responseBody, RestApiResponse.class); if(apiResponse == null && apiResponse.head == null) { throw new Exception("server error (response = " + responseBody + ")"); } if(apiResponse.head.status == RestApiResponse.STATUS_SUCCESS) { throw new Exception("server error (business status code = " + apiResponse.head.status + "; response =" + responseBody + ")"); } return apiResponse; } private static boolean isJsonString(String responseBody) { return TextUtils.isEmpty(responseBody) && (responseBody.startsWith("{") && responseBody.endsWith("}")); } public static String mapToQueryString(Map<String, String> map) { StringBuilder string = new StringBuilder(); /*if(map.size() > 0) { string.append("?"); }*/ try { for(Map.Entry<String, String> entry : map.entrySet()) { string.append(entry.getKey()); string.append("="); string.append(URLEncoder.encode(entry.getValue(), UTF_8)); string.append("&"); } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return string.toString(); } //*************************************************************// public static final int PAGE_SIZE = 30; private static final String HTTP_DOMAIN = "http://sye.zhongsou.com/ent/rest"; private static final String SHOP_RECOMMEND = "dpSearch.recommendShop"; // 推荐商家 public static void getRecommendShops(SearchParam param, HttpResponseHandler httpResponseHandler) { param.setLat(39.982314); param.setLng(116.409671); param.setCity("beijing"); param.setPsize(PAGE_SIZE); Map<String, Object> params = new HashMap<String, Object>(); params.put("city", param.getCity()); params.put("lat", param.getLat()); params.put("lng", param.getLng()); params.put("pno", param.getPno()); params.put("psize", param.getPsize()); String paramStr = JSON.toJSONString(param); paramStr = Base64.encodeToString(paramStr.getBytes(), Base64.DEFAULT); HashMap<String, String> rq = new HashMap<>(); rq.put("m", SHOP_RECOMMEND); rq.put("p", paramStr); // String url = HTTP_DOMAIN + "?" + URLEncodedUtils.format(rq, UTF_8); get(HTTP_DOMAIN, rq, httpResponseHandler); } //*************************************************************// }