OkHttp3使用详解
2016-12-20 11:05
323 查看
OkHttp3是一款非常高效的http框架,下面进行简单的介绍:
1、使用单例模式声明OkHttp3的管理类
这里使用单例模式,保证只有一个OkManager和OkHttpClient 的实例。
2、普通同步get请求
因为现在的Android主线程中不允许进行耗时操作,需要在调用该方法时将操作放在子线程中进行,避免出错!
3、异步GET请求
在实际应用中几乎不可能用到同步方式,所以之后的POST方式介绍时就不写同步方式的了,如果有兴趣请自行Google!
4、POST方式提交字符串
构建一个RequestBody对象,我们在进行post方式提交的过程中需要将提交的内容封装到一个RequestBody中。
构建Request对象
异步请求
5、post提交键值对
6、使用post方式提交多个键值对
7、post方式提交单一文件
使用post方式提交文件时,我们一般需要获取文件的Mine值
8、post方式提交多个文件
服务器源码
案例源码
1、使用单例模式声明OkHttp3的管理类
添加的依赖: compile 'com.squareup.okhttp3:okhttp:3.2.0' compile 'com.squareup.okio:okio:1.7.0' 权限: <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.INTERNET" /> 因为会用到网络和sd卡上的数据,所以需要添加这些权限
public class OkHttpManager { public static final String TAG = "OkHttpManger"; private static OkHttpClient okHttpClient; private static OkHttpManager manager; private OkHttpManager() { okHttpClient = new OkHttpClient(); } public static OkHttpManager getInstance() { synchronized (OkHttpManager.class) { if (manager == 4000 null) { manager = new OkHttpManager(); return manager; } } return manager; } }
这里使用单例模式,保证只有一个OkManager和OkHttpClient 的实例。
2、普通同步get请求
//通过Builder辅助类构建一个Request对象 Request request = new Request.Builder().get().url(url).build(); //通过同步执行获取一个Response对象 Response response = okHttpClient.newCall(request).execute(); //判断响应是否成功,如果成功的话,响应的内容会放在response.body()中 if (response.isSuccessful()) { //字符串类型 Log.i(TAG, "getData: " + response.body().string()); //字节数组类型 Log.i(TAG, "getData: " + response.body().bytes()); //字节流类型 Log.i(TAG, "getData: " + response.body().byteStream()); //字符流类型 Log.i(TAG, "getData: " + response.body().charStream()); }
因为现在的Android主线程中不允许进行耗时操作,需要在调用该方法时将操作放在子线程中进行,避免出错!
3、异步GET请求
//通过Builder辅助类构建一个Request对象 Request request = new Request.Builder().get().url(url).build(); //通过入队的方式,进行异步操作 okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.i(TAG, "onFailure: 请求失败的时候调用该方法!"); } @Override public void onResponse(Call call, Response response) throws IOException { //字符串类型 Log.i(TAG, "getData: " + response.body().string()); //字节数组类型 Log.i(TAG, "getData: " + response.body().bytes()); //字节流类型 Log.i(TAG, "getData: " + response.body().byteStream()); //字符流类型 Log.i(TAG, "getData: " + response.body().charStream()); } });
在实际应用中几乎不可能用到同步方式,所以之后的POST方式介绍时就不写同步方式的了,如果有兴趣请自行Google!
4、POST方式提交字符串
构建一个RequestBody对象,我们在进行post方式提交的过程中需要将提交的内容封装到一个RequestBody中。
构建Request对象
异步请求
/** * 使用post方式提交json字符串 * * @param url 提交的路径 * @param content 提交的内容 */ public void postString(String url, String content) { //构建一个RequestBody对象,,因为提交的是json字符串需要添加一个MediaType为"application/json", // 普通的字符串直接是null就可以了 RequestBody requestBody = RequestBody.create( MediaType.parse("application/json"), content); Request request = new Request.Builder() .url(url) .post(requestBody) .build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.i(TAG, "onFailure: " + e.getMessage()); } @Override public void onResponse(Call call, Response response) throws IOException { Log.i(TAG, "onResponse: " + response.body().string()); } }); }
5、post提交键值对
/** * 提交单个键值对 * * @param url * @param key * @param value */ public static void postKeyValuePaire(String url, String key, String value) { //提交键值对需要用到FormBody,因为FormBody是继承RequestBody的,所以拥有RequestBody的一切属性 FormBody formBody = new FormBody.Builder() //添加键值对 .add(key, value) .build(); Request request = new Request.Builder() .post(formBody) .url(url) .build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { Log.i(TAG, "onResponse: " + response.body().string()); } }); }
6、使用post方式提交多个键值对
/** * 提交多个键值对 * @param url 提交的路径 * @param map 用来放置键值对,map的key对应键,value对应值 */ public static void postKeyValuePaires(String url, Map<String, String> map) { FormBody.Builder build = new FormBody.Builder(); if (map != null) { //增强for循环遍历 for (Map.Entry<String, String> entry : map.entrySet()) { build.add(entry.getKey(), entry.getValue()); } } FormBody formBody = build.build(); Request request = new Request.Builder() .post(formBody) .url(url) .build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { Log.i(TAG, "onResponse: " + response.body().string()); } }); }
7、post方式提交单一文件
使用post方式提交文件时,我们一般需要获取文件的Mine值
/** * 根据文件的名称判断文件的Mine值 */ private String getMediaType(String fileName) { FileNameMap map = URLConnection.getFileNameMap(); String contentTypeFor = map.getContentTypeFor(fileName); if (contentTypeFor == null) { contentTypeFor = "application/octet-stream"; } return contentTypeFor; }
/** * 上传单一文件 */ public void upLoadFile(String url, File file) { // //提交键值对需要用到MultipartBody,因为MultipartBody是继承RequestBody的, // 所以拥有RequestBody的一切属性,类似于javaEE中的表单提交 MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM); RequestBody fileBody = RequestBody.create( MediaType.parse(getMediaType(file.getName())), file); //这里的uploadfile是文件上传的标识,用于服务器识别文件 builder.addFormDataPart("uploadfile", file.getName(), fileBody); MultipartBody body = builder.build(); Request request = new Request.Builder() .url(url) .post(body) .build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.i(TAG, "onFailure: "); } @Override public void onResponse(Call call, Response response) throws IOException { Log.i(TAG, "onResponse: " + response.body().string()); } }); }
8、post方式提交多个文件
/** * 上传多个文件 */ public void upLoadFiles(String url, File[] files) { MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM); for (int i = 0; i < files.length; i++) { RequestBody fileBody = RequestBody.create(MediaType.parse(getMediaType(files[i].getName())), files[i]); builder.addFormDataPart("uploadfile", files[i].getName(), fileBody); } Request request = new Request.Builder().url(url).post(builder.build()).build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.i(TAG, "onFailure: "); } @Override public void onResponse(Call call, Response response) throws IOException { Log.i(TAG, "onResponse: " + response.body().string()); } }); }
9、post方式提交多个文件和参数
/** * 上传多个文件和参数 */ public void upLoadMultiFiles(String url, File[] files, Map<String, String> map) { MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM); //添加文件 if (files.length != 0) { for (int i = 0; i < files.length; i++) { RequestBody fileBody = RequestBody.create( MediaType.parse(getMediaType(files[i].getName())), files[i]); builder.addFormDataPart("uploadfile", files[i].getName(), fileBody); } } //添加参数 if (map != null) { for (Map.Entry<String, String> entry : map.entrySet()) { builder.addFormDataPart(entry.getKey(), entry.getValue()); } } Request request = new Request.Builder().url(url).post(builder.build()).build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { Log.i(TAG, "onFailure: "); } @Override public void onResponse(Call call, Response response) throws IOException { Log.i(TAG, "onResponse: " + response.body().string()); } }); }
服务器源码
案例源码
相关文章推荐
- OkHttp在Android中使用详解
- OkHttp使用详解——完全版
- OKHttp使用详解
- Android中okhttp3使用详解
- okhttp实战使用详解
- OkHttp使用方法详解
- Retrofit 2.0使用详解,配合OkHttp、Gson,Android最强网络请求框架
- OkHttp使用详解一
- okhttp的详解及其缓存的使用
- okhttp的使用及详解
- Retrofit 2.0使用详解,配合OkHttp、Gson,Android最强网络请求框架
- Okhttp使用详解
- OkHttp使用详解
- OkHttp3使用详解
- Android OkHttp的简单使用和封装详解
- OKHttp使用详解及源码解析
- Android OkHttp 网络请求 使用详解
- Android okhttp3的使用详解
- OkHttp使用详解
- OKHttp使用详解,步骤挺详细的,适合初学者使用!