import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
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.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* Author:kson
* E-mail:19655910@qq.com
* Time:2018/05/08
* Description:okhttp封装
*/
public class OkHttpUtils {
//单例设计模式/其他比如builder模式
//封装常用的请求方式,get、post
//扩展:封装拦截器以及其他的扩展功能
private static OkHttpUtils okHttpUtils;
private OkHttpClient okHttpClient;
static String result = "";
private static Handler handler;
private ICallback iCallback;
private final String LOGNAME=OkHttpUtils.class.getCanonicalName();
private OkHttpUtils() {
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (iCallback != null) {
iCallback.getData(msg.obj.toString());
}
}
};
initOK();
}
public void setiCallback(ICallback iCallback) {
this.iCallback = iCallback;
}
/**
* 创建ok
*/
private void initOK() {
Log.e(LOGNAME,"初始化ok");
File file=new File(Environment.getExternalStorageDirectory(),"CacheOK");
okHttpClient = new OkHttpClient.Builder()
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(1000, TimeUnit.MILLISECONDS)//毫秒制
.cache(new Cache(file,1000))//sdcard本地缓存
.connectTimeout(5, TimeUnit.SECONDS).build();//秒制
}
public OkHttpUtils getInstance() {
if (okHttpUtils == null) {
synchronized (OkHttpUtils.class) {
if (okHttpUtils == null) {
okHttpUtils = new OkHttpUtils();
}
}
}
return okHttpUtils;
}
/**
* get请求
*
* @return
*/
public void DoGet(String url) {
if(iCallback==null){
Log.e(LOGNAME,"iCallback=null setiCallback没有调用建立连接");
return;
}else{
Log.e(LOGNAME,"DOGet");
}
Request request = new Request.Builder()
.url(url)
.get().build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(LOGNAME,"DoGET异常");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
if (response.code() == 200) {
result = response.body().string();
Message message = new Message();
message.obj = result;
handler.sendMessage(message);
}
}
}
});
}
/**
* post请求:1原生表单 2.支持文件的,或者两个方式封装到一个方法里
*
* @return
*/
public void DoPost(Map<String, String> params) {
if(params==null||params.size()==0||iCallback==null){
if(params==null){
Log.e(LOGNAME,"参数对象无实力");
}
if(params.size()==0){
Log.e(LOGNAME,"参数数量为零");
}
if(iCallback==null){
Log.e(LOGNAME,"iCallback=null setiCallback没有调用建立连接");
}
return;
}else {
Log.e(LOGNAME,"DoPost");
}
//1.FORM原生表单,<form></form>(单纯提交字符串类型的键值对)2.multipart/form-data(1.字符串类型键值对和文件) 3.raw(json、xml) 4.binary(文件流)
//1.普通表单
//普通表单
FormBody.Builder builder = new FormBody.Builder();
for (Map.Entry<String, String> stringStringEntry : params.entrySet()) {
if (!"url".equals(stringStringEntry.getKey())) {
builder.add(stringStringEntry.getKey(), stringStringEntry.getValue());
}
}
Request request = new Request.Builder()
.url(params.get("url"))
.post(builder.build()).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(LOGNAME,"DOPost异常");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
if (response.code() == 200) {
Log.e(LOGNAME,"请求成功");
result = response.body().string();
Message message = new Message();
message.obj = result;
handler.sendMessage(message);
}
}
}
});
}
/**
* post请求:2.支持文件的,或者两个方式封装到一个方法里
*
* @return
*/
public void DoUpFile(Map<String, Object> params) {
if(params==null||params.size()==0||iCallback==null){
if(params==null){
Log.e(LOGNAME,"参数对象无实力");
}
if(params.size()==0){
Log.e(LOGNAME,"参数数量为零");
}
if(iCallback==null){
Log.e(LOGNAME,"iCallback=null setiCallback没有调用建立连接");
}
return;
}else {
Log.e(LOGNAME,"DoPost");
}
//1.FORM原生表单,<form></form>(单纯提交字符串类型的键值对)2.multipart/form-data(1.字符串类型键值对和文件) 3.raw(json、xml) 4.binary(文件流)
//1.普通表单
//multipart/form-data
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
for (Map.Entry<String, Object> stringObjectEntry : params.entrySet()) {//便利
String key = stringObjectEntry.getKey();//取值建
Object value = stringObjectEntry.getValue();//取值
if (value instanceof File) {//是否是文件实力
File file = (File) value;
if(!file.exists()){//判断是否可执行文件
file.mkdirs();
if(!file.isFile()){//是否文件
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
}
//MediaType.parse("application/octet-stream")以二进制的形式上传文件
builder.addFormDataPart(key, file.getName(), RequestBody.create(MediaType.parse("application/octet-stream"), file));
} else {
if(!"url".equals(key)){
builder.addFormDataPart(key, value.toString());
}
}
}
Request request = new Request.Builder()
.url(params.get("url").toString())
.post(builder.build()).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
Log.e(LOGNAME,"DOUpFile异常");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
if (response.code() == 200) {
Log.e(LOGNAME,"上传成功");
result = response.body().string();
Message message = new Message();
message.obj = result;
handler.sendMessage(message);
}
}
}
});
}
public interface ICallback {
void getData(String result);
void fairly();
}