最近整理一些Http请求框架,发现okHttp蛮不错,毕竟Android 4.4底层有用到,加上自己项目中有用到七牛云储存,其中Http也是okHttp,所以查了一些,目前OkHttp还是蛮受欢迎,借此学习并且整理一个简单 okHttp框架,说不定日后项目中可以用到。
在okHttp中比较重要的类为 OkHttpClient 用于配置和创建HTTP连接,在项目中做一个单例,不必每次请求都创建。
public class HttpRequest { private static final String TAG = HttpRequest.class.getSimpleName(); private static HttpRequest mInstance = null; private OkHttpClient mOkHttpClient; private File cacheDirectory = new File(FileHelper.getCacheHttpDir("okHttpCache")); private long cacheSize = 10 * 1024 * 1024; public static synchronized HttpRequest getInstance() { if (mInstance == null) { mInstance = new HttpRequest(); } return mInstance; } public OkHttpClient getOkHttpClient() { if (mOkHttpClient == null) { mOkHttpClient = new OkHttpClient(); mOkHttpClient.setConnectTimeout(30, TimeUnit.SECONDS); mOkHttpClient.setReadTimeout(30, TimeUnit.SECONDS); Cache cache = new Cache(cacheDirectory, cacheSize); mOkHttpClient.setCache(cache); } return mOkHttpClient; } }
这里配置了请求超时 已经 缓存路径及容量。
关于okHttp 如何配置 Https 以及 Cookie
参考:
https :参考Https
Cookie: 参考 1 Cookie 参考 2 Cookie
那么接着如何封装一个Http请求呢?
private void request(final int method, String tag) { Request request = methodBuilder(method, tag); Call call = HttpRequest.getInstance().getOkHttpClient().newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Request request, IOException e) { mHandler.post(new Runnable() { @Override public void run() { } }); } @Override public void onResponse(final Response response) throws IOException { mHandler.post(new Runnable() { @Override public void run() { String jsonResponse = null; try { jsonResponse = response.body().string(); } catch (IOException e) { e.printStackTrace(); } } }); } }); }
* 这里注意一下,在回调 onFailure 和 onResponse 结果集都是在子线程中,所以不能直接更新UI层,所以需要hander.
在构造方法中,记得初始化Hander
mHandler = new Handler(Looper.getMainLooper());
*在onResponse Response返回时候,我们可以获取很多类型,这里获取的是Stirng
可以看看 源码中的 public abstract classResponseBody 有哪些方法
我们可以看到 也可以返回 byte[] , InputStream 等类型。
methodBuilder(method,tag) 方法为一个构造器,也就是 okHttp Request 请求集合。
private Request methodBuilder(int method, String tag) { Request.Builder builder = new Request.Builder(); builder.url(getUrl(method)); builder.tag(tag); builder.headers(addHeaders()); switch (method) { case Method.GET: builder.get(); break; case Method.POST: builder.post(addMultipartBuilder()); break; case Method.PUT: builder.put(addMultipartBuilder()); break; case Method.DELETE: builder.delete(addMultipartBuilder()); break; } Log.d(TAG, "Method: " + getMethodStr(method) + " url: " + builder.build().httpUrl().toString()); return builder.build(); }
参数很明确,
url 请求地址,当get请求时候 需要用addQueryParameter 来拼接
tag 标签,用于撤销Call
headers 一般为Http 的头部,我们可以放些后台需要的参数,例如 User-Agent
主要是构建不同的请求方式,所以我们传进来method 来判断,只用构建一个 Request
当post时候我们需要在body 里面放一些参数, 所以用的是 MultipartBuilder
可以参考 okHttp wiki Posting a multipart request 里面也可以找到File文件上传,等方式。
接口Method 常用的Http请求方式。
interface Method { int DEPRECATED_GET_OR_POST = -1; int GET = 0; int POST = 1; int PUT = 2; int DELETE = 3; int HEAD = 4; int OPTIONS = 5; int TRACE = 6; int PATCH = 7; }
String getMethodStr(int method) { switch (method) { case Method.GET: return "GET"; case Method.POST: return "POST"; case Method.PUT: return "PUT"; case Method.DELETE: return "DELETE"; default: return "-->"; } }
--------
关于OkHttp get 也能够拥有缓存策略,
也就是在构建 Request 时候
builder.header("Cache-Control", "only-if-cached"); builder.header("Cache-Control", "max-stale=" + maxStale);可参考: okhttp响应缓存