首先,导入依赖:
compile 'com.squareup.okhttp3:okhttp:3.10.0'
然后请看代码:
package com.example.zym.shopping.utils; import android.os.Environment; import android.os.Handler; import android.util.Log; import com.google.gson.Gson; import java.io.File; import java.io.IOException; import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.logging.LogRecord; import okhttp3.Cache; import okhttp3.Call; import okhttp3.Callback; import okhttp3.FormBody; import okhttp3.Interceptor; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Response; import okhttp3.ResponseBody; /** * Created by eric on 2018/3/31. */ public class HttpUtils { private static final String TAG = "HttpUtils"; private static volatile HttpUtils instance; public Handler handler = new Handler(); private OkHttpClient client; private Interceptor getAppInterceptor(){ Interceptor interceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Log.e("++++++++++","拦截前"); //---------请求之前------------ Response response = chain.proceed(request); Log.e("++++++++++","拦截后"); //---------请求之后------------ return response; } }; return interceptor; } private HttpUtils() { File file = new File(Environment.getExternalStorageDirectory(), "cache11"); client = new OkHttpClient().newBuilder() .readTimeout(3000, TimeUnit.SECONDS) //设置读取超时时间 .connectTimeout(3000, TimeUnit.SECONDS) //设置连接的超时时间 .addInterceptor(getAppInterceptor())//Application拦截器 .cache(new Cache(file, 10 * 1024)) .build(); } public static HttpUtils getInstance() { if (instance == null) { synchronized (HttpUtils.class) { if(null == instance) { instance = new HttpUtils(); } } } return instance; } public void doGet(String url, final Class clazz, final NetCallBack netCallBack) { // 2. 创建一个请求对象 Request request = new Request.Builder() .get() .url(url) .build(); // 3. 创建出一个Call对象 Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { netCallBack.onFailure(e); } }); } @Override public void onResponse(Call call, Response response) throws IOException { // 注意:response.body()只能用一次 // Log.i(TAG, "onResponse: "+response.body().string()); String result = response.body().string(); Gson gson = new Gson(); final Object o = gson.fromJson(result, clazz); handler.post(new Runnable() { @Override public void run() { netCallBack.onSuccess(o); } }); // Log.i(TAG, "onResponse: "+result); } }); } public void doPost(String url, final Class clazz, Map<String,String> parms, final NetCallBack netCallBack){ //不是FormBody,而是一个Builder FormBody.Builder body = new FormBody.Builder(); //key value for (String key:parms.keySet()){ //value的值 body.add(key,parms.get(key)); } Request request = new Request.Builder() .url(url) .post(body.build()) .build(); // 3. 创建出一个Call对象 Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { netCallBack.onFailure(e); } }); } @Override public void onResponse(Call call, Response response) throws IOException { // 注意:response.body()只能用一次 // Log.i(TAG, "onResponse: "+response.body().string()); String result = response.body().string(); Gson gson = new Gson(); final Object o = gson.fromJson(result, clazz); handler.post(new Runnable() { @Override public void run() { netCallBack.onSuccess(o); } }); } }); } public interface NetCallBack { void onSuccess(Object o); void onFailure(Exception e); } }
-------------------------------------------------------------------------------------------------------------------------------
package com.bwie.categorydemo;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.text.TextUtils;
import android.util.Log;
import com.google.gson.Gson;
import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Map;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
/**
* Created by eric on 2018/4/14.
*/
public class OkHttpUtils {
private static final String TAG = "OkHttpUtils";
private static volatile OkHttpUtils instance;
private OkHttpClient client;
public Handler handler = new Handler();
private OkHttpUtils() {
client = new OkHttpClient();
}
/**
* 双重校验锁机制的单例模式
*
* @return
*/
public static OkHttpUtils getInstance() {
if (instance == null) {
synchronized (OkHttpUtils.class) {
if (null == instance) {
instance = new OkHttpUtils();
}
}
}
return instance;
}
/**
* OKHttp的get请求
* @param url
* @param map
* @param clazz
* @param responseCallBack
*/
public void get(String url, Map<String, String> map, final Type type, final ResponseCallBack responseCallBack) {
if (TextUtils.isEmpty(url)) {
return;
}
// 拼接url
StringBuilder sb = getRealUrl(url, map);
String str = sb.toString();
Log.i(TAG, "get url is: " + str);
// url换成最终拼接好的字符串
final Request request = new Request.Builder()
.get()
.url(str)
.build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, final IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
responseCallBack.failed(e);
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String result = response.body().string();
Gson gson = new Gson();
final Object o = gson.fromJson(result, type);
handler.post(new Runnable() {
@Override
public void run() {
responseCallBack.success(o);
}
});
}
});
}
/**
* 拼接url
* @param url
* @param map
* @return
*/
@NonNull
private StringBuilder getRealUrl(String url, Map<String, String> map) {
//情况一: url:http://www.baidu.com?name=zs&password=123
// map=null
//情况二: url:http://www.baidu.com
// map: name-zs password-123
//情况三: url:http://www.baidu.com?
// map:name-zs password-123
StringBuilder sb = new StringBuilder();
sb.append(url);
// 情况一或情况三,也就是url中有"?"
if (url.contains("?")) {
// 情况三:最后一个是问号
if (url.lastIndexOf("?") == url.length() - 1) {
for (Map.Entry<String, String> entry : map.entrySet()) {
// http://www.baidu.com?name=zs&password=123&
sb.append(entry.getKey())
.append("=")
.append(entry.getValue())
.append("&");
}
if (sb.toString().contains("&")) {
sb.deleteCharAt(sb.lastIndexOf("&"));
}
} else {
// 情况一: 最后一个不是问号
// url:http://www.baidu.com?name=zs&password=123
if (map != null) {
for (Map.Entry<String, String> entry : map.entrySet()) {
sb.append("&")
.append(entry.getKey())
.append("=")
.append(entry.getValue());
}
}
}
} else {
// 情况二:不带问号
//情况二: url:http://www.baidu.com?key=value & key = value
// map: name-zs password-123
for (Map.Entry<String, String> entry : map.entrySet()) {
sb.append("&")
.append(entry.getKey())
.append("=")
.append(entry.getValue());
}
if (sb.toString().contains("&")) {
int index = sb.indexOf("&");
sb.replace(index, index + 1, "?");
}
}
return sb;
}
}