使用:
单利模式的
compile 'com.squareup.okhttp3:okhttp:3.8.1'
public class OkHttpUtil { //静态本类对象 private static OkHttpUtil okHttpUtil; private OkHttpClient okHttpClient; //私有化构造方法 private OkHttpUtil() { okHttpClient = new OkHttpClient.Builder().build(); } //公共的供外部访问的方法 public static OkHttpUtil getInstance() { if (okHttpUtil == null) { synchronized (OkHttpUtil.class) { if (okHttpUtil == null) { okHttpUtil = new OkHttpUtil(); } } } return okHttpUtil; } public void get(String url, Map<String, String> map, final NetworkCallback networkCallback) { if (map != null && map.size() > 0) { StringBuffer sb = new StringBuffer(url); sb.append("?"); Set<String> set = map.keySet(); for (String str : set) { sb.append(str).append("=").append(map.get(str)).append("&"); } url = sb.substring(0, sb.length() - 1); } Request request = new Request.Builder().url(url).build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { networkCallback.error(e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); networkCallback.successful(string); } }); } public void post(String url, Map<String, String> map, final NetworkCallback networkCallback) { if (map != null && map.size() > 0) { StringBuffer sb = new StringBuffer(url); sb.append("?"); Set<String> set = map.keySet(); for (String str : set) { sb.append(str).append("=").append(map.get(str)).append("&"); } url = sb.substring(0, sb.length() - 1); } RequestBody body = new FormBody.Builder().build(); Request request = new Request.Builder().url(url).method("POST", body).build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { networkCallback.error(e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); networkCallback.successful(string); } }); } }
文件上传
接下来我们在介绍一个可以构造RequestBody的生成器,叫做MultipartBuilder
。当我们需要做类似于表单上传的时候,就可以使用它来构造我们的requestBody。
File file = new File(Environment.getExternalStorageDirectory(), "balabala.mp4");
RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
RequestBody requestBody = new MultipartBuilder()
.type(MultipartBuilder.FORM)
.addPart(Headers.of(
"Content-Disposition",
"form-data; name=\"username\""),
RequestBody.create(null, "张鸿洋"))
.addPart(Headers.of(
"Content-Disposition",
"form-data; name=\"mFile\";
filename=\"wjd.mp4\""), fileBody)
.build();
Request request = new Request.Builder()
.url("http://192.168.1.103:8080/okHttpServer/fileUpload")
.post(requestBody)
.build();
Call call = mOkHttpClient.newCall(request);
call.enqueue(new Callback()
{
//...
});
- 1
- 2
- 3
- 4
- 五
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
代码上述服务器向传递了一个键值对username:张鸿洋
状语从句:一个文件。我们通过MultipartBuilder的addPart方法可以添加键值对或者文件。
其实类似于我们拼接模拟浏览器行为的方式,如果你对这块不懂,可以参考:从原理角度解析Android(Java)http文件上传
确定,对于我们最开始的目录还剩下图片下载,文件下载;这两个一个是通过回调的响应拿到字节[]然后解码成图片;文件下载,就是拿到的inputStream做写文件操作,我们这里就不赘述了。
关于用法,可以也。参考泡网OkHttp使用教程
接下来我们主要看如何封装上述的代码。
三,封装
由于按照上述的代码,写多个请求肯定包含大量的重复代码,所以我希望封装后的代码调用是这样的:
(一)使用
一般的GET请求
OkHttpClientManager.getAsyn("https://www.baidu.com", new OkHttpClientManager.ResultCallback<String>() { @Override public void onError(Request request, Exception e) { e.printStackTrace(); } @Override public void onResponse(String u) { mTv.setText(u);//注意这里是UI线程 } });