package com.kiisoo.ic.utils; import com.google.gson.Gson; import com.google.gson.JsonArray; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.kiisoo.ic.common.ErrorMesage; import com.kiisoo.ic.common.MessageException; import okhttp3.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; /** * @author dexiang * @date 2017/10/30 * @company kiisoo * @details okhttp工具类 */ public class OkhttpUtil { /** * 日志打印 */ private static final Logger logger = LoggerFactory.getLogger(OkhttpUtil.class); /** * 实例 */ private static OkhttpUtil instance; /** * 请求管理实例 */ private OkHttpClient okHttpClient; /** * 认证token */ private static String authorization; /** * 客流认证token */ private static String token; public static String getToken() { return token; } public static void setToken(String token) { OkhttpUtil.token = token; } /** * 错误的key */ private static final String ERROS = "erros"; /** * 此处配置OkHttpClient的基本信息 okhttp3在new对象并需要配置参数一般通过build这个方法来实现 类似的还有Request * 构建形式如:new XXX.Builder().xxx().xxx().build(); * * @author dexiang.jiang */ private OkhttpUtil() { okHttpClient = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS) .build(); } /** * 单例模式 * * @return 返回OkhttpUtil实例 * @author dexiang.jiang */ public static OkhttpUtil getInstance() { if (instance == null) { synchronized (OkhttpUtil.class) { if (instance == null) { instance = new OkhttpUtil(); } } } return instance; } /** * 传入JSON字符串结果 判断错误信息并抛出异常 * * @param result 结果 * @return 返回JSON字符串 */ public String isResult(String result) throws MessageException { if (result.contains(ERROS)) { JsonObject json = new JsonParser().parse(result).getAsJsonObject(); JsonArray erros = json.getAsJsonArray(ERROS); ErrorMesage errorMesage = new Gson().fromJson(erros.get(0), ErrorMesage.class); throw new MessageException(errorMesage); } return result; } public String params(Map params) { StringBuilder sb = new StringBuilder(); if (params != null && params.size() > 0) { Set> entrySet = params.entrySet(); sb.append("?"); try { for (Map.Entry entry : entrySet) { Object val = entry.getValue(); if (null != val) { sb.append(entry.getKey()); sb.append("="); sb.append(URLEncoder.encode(val.toString(), "UTF-8")); sb.append("&"); } } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } sb.deleteCharAt(sb.length() - 1); } System.out.println(sb.toString()); return sb.toString(); } /** * 一般的get请求 对于一般的请求,我们希望给个url,然后取的返回的String。 * * @param url 请求路径 * @return 返回JSON字符串 * @throws IOException 异常 */ public String get(String url) throws IOException, MessageException { return get(url, null); } /** * get请求 * * @param url 请求路径 * @param params 请求参数 * @return 返回 * @throws IOException 异常 */ public String get(String url, Map params) throws IOException, MessageException { String paramstr = params(params); Request request = new Request.Builder().url(url + paramstr).get() .addHeader("content-type", "application/json").addHeader("Authorization", "Basic " + getAuthorization()) .build(); Call call = okHttpClient.newCall(request); return isResult(call.execute().body().string()); } /** * 一般的post请求 对于一般的请求,我们希望给个url和封装参数的Map,然后取的返回的String。 * * @param url 请求路径 * @param params 请求参数 * @return 返回结果 * @throws IOException 异常 * @author dexiang.jiang */ public String post(String url, Map params) throws IOException, MessageException { MediaType mediaType = MediaType.parse("application/json"); String json = new Gson().toJson(params); RequestBody body = RequestBody.create(mediaType, json); Request request = new Request.Builder().url(url).post(body) .addHeader("content-type", "application/json").addHeader("Authorization", "Basic " + authorization) .build(); Call call = okHttpClient.newCall(request); return isResult(call.execute().body().string()); } public String getAuthorization() { return authorization; } public void setAuthorization(String auth) { authorization = auth; } }