XiMengJianYu/.svn/pristine/84/843c0a5d5ebf09c54946270d8a90451c73617606.svn-base
2023-04-17 17:58:44 +08:00

384 lines
12 KiB
Plaintext
Executable File

package com.cm.utils.net;
import android.content.Context;
import android.os.Handler;
import com.cm.utils.net.body.ProgressRequestBody;
import com.cm.utils.net.body.ResponseProgressBody;
import com.cm.utils.net.callback.DownloadCallback;
import com.cm.utils.net.callback.RequestCallBack;
import com.cm.utils.net.response.DownloadResponseHandler;
import com.cm.utils.net.response.ResponseHandler;
import java.io.File;
import java.io.IOException;
import java.net.FileNameMap;
import java.net.URLConnection;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Call;
import okhttp3.FormBody;
import okhttp3.Headers;
import okhttp3.Interceptor;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
/**
* Created by Xuer on 2017/3/8.
*/
public class HttpUtils {
private OkHttpClient client;
private static HttpUtils instance;
private String TAG = "HttpUtils";
private HttpUtils() {
// client = new OkHttpClient();
// OkHttpClient.Builder builder= new OkHttpClient.Builder();
// client=builder.build();
client = new OkHttpClient.Builder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(40, TimeUnit.SECONDS)
.build();
}
/*
* 用来创建
*/
private static synchronized void syncInit() {
if (instance == null) {
instance = new HttpUtils();
}
}
/**
* 用来得到单例
*
* @return
*/
public static HttpUtils getInstance() {
if (instance == null) {
syncInit();
}
return instance;
}
/**
* get 请求
*
* @param url url
* @param params 参数
* @param responseHandler 回调
*/
public void get(final String url, final Map<String, String> params, final ResponseHandler responseHandler) {
get(null, url, params, responseHandler);
}
/**
* get 请求
*
* @param context 发起请求的context
* @param url url
* @param params 参数
* @param responseHandler 回调
*/
public void get(Context context, final String url, final Map<String, String> params, final ResponseHandler responseHandler) {
//拼接url
String get_url = url;
if (params != null && params.size() > 0) {
int i = 0;
for (Map.Entry<String, String> entry : params.entrySet()) {
if (i++ == 0) {
get_url = get_url + "?" + entry.getKey() + "=" + entry.getValue();
} else {
get_url = get_url + "&" + entry.getKey() + "=" + entry.getValue();
}
}
}
Request request;
//发起request
if (context == null) {
request = new Request.Builder()
.url(url)
.build();
} else {
request = new Request.Builder()
.url(url)
.tag(context)
.build();
}
client.newCall(request).enqueue(new RequestCallBack(responseHandler));
}
/**
* post 请求
*
* @param url url
* @param params 参数
* @param responseHandler 回调
*/
public void post(final String url, final Map<String, String> params, final ResponseHandler responseHandler) {
post(null, url, params, responseHandler);
}
/**
* post 请求
*
* @param context 发起请求的context
* @param url url
* @param params 参数
* @param responseHandler 回调
*/
public void post(Context context, final String url, final Map<String, String> params, final ResponseHandler responseHandler) {
//post builder 参数
FormBody.Builder builder = new FormBody.Builder();
if (params != null && params.size() > 0) {
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
}
Request request;
//发起request
if (context == null) {
request = new Request.Builder()
.url(url)
.post(builder.build())
.build();
} else {
request = new Request.Builder()
.url(url)
.post(builder.build())
.tag(context)
.build();
}
client.newCall(request).enqueue(new RequestCallBack(responseHandler));
}
/**
* post 请求
*
* @param context 发起请求的context
* @param url url
* @param params 参数
*/
public Response postExecute(Context context, final String url, final Map<String, String> params) throws IOException {
//post builder 参数
FormBody.Builder builder = new FormBody.Builder();
if (params != null && params.size() > 0) {
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
}
Request request;
//发起request
if (context == null) {
request = new Request.Builder()
.url(url)
.post(builder.build())
.build();
} else {
request = new Request.Builder()
.url(url)
.post(builder.build())
.tag(context)
.build();
}
Response response = client.newCall(request).execute();
return response;
}
/**
* 上传文件
*
* @param url url
* @param files 上传的文件files
* @param responseHandler 回调
*/
public void upload(String url, Map<String, File> files, final ResponseHandler responseHandler) {
upload(null, url, null, files, responseHandler);
}
/**
* 上传文件
*
* @param url url
* @param params 参数
* @param files 上传的文件files
* @param responseHandler 回调
*/
public void upload(String url, Map<String, String> params, Map<String, File> files, final ResponseHandler responseHandler) {
upload(null, url, params, files, responseHandler);
}
/**
* 上传文件
*
* @param context 发起请求的context
* @param url url
* @param files 上传的文件files
* @param responseHandler 回调
*/
public void upload(Context context, String url, Map<String, File> files, final ResponseHandler responseHandler) {
upload(context, url, null, files, responseHandler);
}
/**
* 上传文件
*
* @param context 发起请求的context
* @param url url
* @param params 参数
* @param files 上传的文件files
* @param responseHandler 回调
*/
public void upload(Context context, String url, Map<String, String> params, Map<String, File> files, final ResponseHandler responseHandler) {
MultipartBody.Builder multipartBuilder = new MultipartBody.Builder().setType(MultipartBody.FORM);
//添加参数
if (params != null && !params.isEmpty()) {
for (String key : params.keySet()) {
multipartBuilder.addPart(Headers.of("Content-Disposition", "form-data; name=\"" + key + "\""),
RequestBody.create(null, params.get(key)));
}
}
//添加上传文件
if (files != null && !files.isEmpty()) {
RequestBody fileBody;
for (String key : files.keySet()) {
File file = files.get(key);
String fileName = file.getName();
fileBody = RequestBody.create(MediaType.parse(guessMimeType(fileName)), file);
multipartBuilder.addPart(Headers.of("Content-Disposition",
"form-data; name=\"" + key + "\"; filename=\"" + fileName + "\""),
fileBody);
}
}
Request request;
if (context == null) {
request = new Request.Builder()
.url(url)
.post(new ProgressRequestBody(multipartBuilder.build(), responseHandler))
.build();
} else {
request = new Request.Builder()
.url(url)
.post(new ProgressRequestBody(multipartBuilder.build(), responseHandler))
.tag(context)
.build();
}
client.newCall(request).enqueue(new RequestCallBack(responseHandler));
}
/**
* 下载文件
*
* @param url 下载地址
* @param filedir 下载目的目录
* @param filename 下载目的文件名
* @param downloadResponseHandler 下载回调
*/
public void download(String url, String filedir, String filename, final DownloadResponseHandler downloadResponseHandler) {
download(null, url, filedir, filename, downloadResponseHandler);
}
/**
* 下载文件
*
* @param context 发起请求的context
* @param url 下载地址
* @param filedir 下载目的目录
* @param filename 下载目的文件名
* @param downloadResponseHandler 下载回调
*/
public void download(Context context, String url, String filedir, String filename, final DownloadResponseHandler downloadResponseHandler) {
Request request;
if (context == null) {
request = new Request.Builder()
.url(url)
.build();
} else {
request = new Request.Builder()
.url(url)
.tag(context)
.build();
}
client.newBuilder()
.addNetworkInterceptor(new Interceptor() { //设置拦截器
@Override
public Response intercept(Chain chain) throws IOException {
Response originalResponse = chain.proceed(chain.request());
return originalResponse.newBuilder()
.body(new ResponseProgressBody(originalResponse.body(), downloadResponseHandler))
.build();
}
})
.build()
.newCall(request)
.enqueue(new DownloadCallback(new Handler(), downloadResponseHandler, filedir, filename));
}
/**
* 取消当前context的所有请求
*
* @param context
*/
public void cancel(Context context) {
if (client != null) {
for (Call call : client.dispatcher().queuedCalls()) {
if (call.request().tag().equals(context))
call.cancel();
}
for (Call call : client.dispatcher().runningCalls()) {
if (call.request().tag().equals(context))
call.cancel();
}
}
}
/**
* 取消当前所有的所有请求
*
*
*/
public void cancel() {
for (Call call : client.dispatcher().queuedCalls()) {
call.cancel();
}
for (Call call : client.dispatcher().runningCalls()) {
call.cancel();
}
}
//获取mime type
private String guessMimeType(String path) {
FileNameMap fileNameMap = URLConnection.getFileNameMap();
String contentTypeFor = fileNameMap.getContentTypeFor(path);
if (contentTypeFor == null) {
contentTypeFor = "application/octet-stream";
}
return contentTypeFor;
}
}