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:[email protected]
* 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(); }