//首先我們先寫一個接口
public interface IHttp {
// GET請求
<T>void get(String url, Map<String,String>paramsMap,MyCallBack<T>callBack);
// POST請求
<T>void post(String url,Map<String,String>paramsMap,MyCallBack<T>callBack);
}
//MyCallBack接口
public interface MyCallBack<T> {
// 請求成功的方法
void success(T t);
// 請求失敗的方法
void faile(String msg);
}
//單例
/*
* 将HttpUtils執行個體通過單例提供出去
* */
public class HttpUtils implements IHttp {
// 建立私有的靜态的本類對象
private static HttpUtils utils;
// 建立私有的OkhttpClient對象
private OkHttpClient client;
private HttpUtils() {
client = new OkHttpClient();
}
public static synchronized IHttp getInstance() {
if (utils == null) {
utils = new HttpUtils();
}
return utils;
}
//http://www.baidu.com?name=zhangsan&pwd=123
@Override
public <T> void get(String baseUrl, Map<String, String> paramsMap, final MyCallBack<T> callBack) {
StringBuffer buffer = new StringBuffer();
buffer.append("?");
if (paramsMap != null && paramsMap.size() > 0) {
for (String key : paramsMap.keySet()) {
String value = paramsMap.get(key);
buffer.append(key).append("=").append(value).append("&");
}
buffer.toString().trim().substring(0, buffer.toString().trim().length() - 1);
}
String getUrl = buffer.toString().trim();
Request build = new Request.Builder().url(getUrl).build();
client.newCall(build).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callBack.faile(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String json = response.body().string();
callBack.success(getParseData(json, callBack));
}
});
}
/**
* 通過反射的形式,将CallBack接口的實作類的類類型
* 然後将類類型傳到Gson中,最後得到解析後的結果(類類型對應的實體)
*
* @param jsonData
* @param callBack
* @param <T>
* @return
*/
private <T> T getParseData(String jsonData, MyCallBack<T> callBack) {
Type[] interfacetypes = callBack.getClass().getGenericInterfaces();
Type[] types = ((ParameterizedType) interfacetypes[0]).getActualTypeArguments();
Type type = types[0];
Gson gson = new Gson();
T t = gson.fromJson(jsonData, type);
return t;
}
//http://www.baidu.com
@Override
public <T> void post(String url, Map<String, String> paramsMap, final MyCallBack<T> callBack) {
FormBody.Builder formBuilder = new FormBody.Builder();
for (String key : paramsMap.keySet()) {
formBuilder.add(key, paramsMap.get(key));
}
FormBody body = formBuilder.build();
Request build = new Request.Builder().url(url).post(body).build();
client.newCall(build).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callBack.faile(e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String json = response.body().string();
callBack.success(getParseData(json, callBack));
}
});
}
}