先在 build.gradle中加依赖:
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
使用OkHttp,肯定需要访问网络,所以需要网络权限
<uses-permission android:name="android.permission.INTERNET" />
然后对OkHttp封装处理:
package com.example.m1539.Util;
import android.os.Environment;
import android.support.annotation.Nullable;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Cache;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okio.BufferedSink;
public class okHttp3 {
/**
* 懒汉 安全 加同步
* 私有的静态成员变量 只能声明,不能创建
* 私有的构造方法
* 提供返回实例的静态方法
*/
private static OkHttpClient okHttpClient = null;
private okHttp3(){}
public static OkHttpClient getInstence(){
if(okHttpClient == null){
synchronized (okHttp3.class){
if(okHttpClient == null){
//okHttp 可以缓存数据,指定缓存路径
File sdcache = new File(Environment.getExternalStorageDirectory(),"huancun");
//指定缓存
int chcheSize = 10*1024*1024;
okHttpClient = new OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS) //链接超时
.writeTimeout(20,TimeUnit.SECONDS) //写入超时
.readTimeout(20, TimeUnit.SECONDS) //读取超时
.cache(new Cache(sdcache.getAbsoluteFile(), chcheSize)) //设置缓存
.build();
}
}
}
return okHttpClient;
}
/**
* get请求方法
* @param url
* @param callback
*/
public static void doGet(String url, Callback callback){
//创建OkHttp请求对象
OkHttpClient okHttpClient = getInstence();
//创建Request
Request request = new Request.Builder()
.url(url)
.build();
//得到Call对象
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
/**
* Post 提交String
* @param url
* @param callback
*/
public static void doPostToString(String url, String str, Callback callback){
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
Request request = new Request.Builder()
.url(url)
.post(RequestBody.create(mediaType, str)) //传入RequestBody对象
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
/**
* Post 提交 表单信息
* @param url
* @param params
* @param callback
*/
public static void doPostToForm(String url, Map<String, String> params , Callback callback){
//创建OkHttpClient对象
OkHttpClient okHttpClient = getInstence();
FormBody.Builder builder = new FormBody.Builder();
//遍历集合
for(String key:params.keySet()){
builder.add(key,params.get(key));
}
//创建Request
Request request = new Request.Builder()
.url(url)
.post(builder.build()) //传入RequestBody对象
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
/**
* Post 提交 流
* @param url
* @param str
* @param callback
*/
public static void doPostToIO(String url,final String str, Callback callback){
RequestBody requestBody = new RequestBody() {
@Nullable
@Override
public MediaType contentType() {
return MediaType.parse("text/x-markdown; charset=utf-8");
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
sink.writeUtf8(str);
}
};
OkHttpClient okHttpClient = getInstence();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
/**
* Post 提交 文件
* @param url
* @param f
* @param callback
*/
public static void doPostToFile(String url, File f, Callback callback){
MediaType mediaType = MediaType.parse("text/x-markdown; charset=utf-8");
OkHttpClient okHttpClient = getInstence();
Request request = new Request.Builder()
.url(url)
.post(RequestBody.create(mediaType, f))
.build();
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
}
外部调用(已传 键值对为例):
Map<String,String> map = new HashMap<>();
map.put("page","1");
LogUtil.level = LogUtil.INFO;
okHttp3.doPostToForm("https://www.apiopen.top/meituApi", map, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
LogUtil.i("mylog","e:"+e.getMessage());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
LogUtil.i("mylog","response:"+response.body().string());
}
});
注意:callback中的response取值,需要调用 response.body().string()