AndroidStudio引入okHttp3
implementation files('libs/okio-1.14.1.jar')
implementation files('libs/okhttp-3.10.0.jar')
//-----------------------------引入最新的版本号
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
下载jar包
链接:https://pan.baidu.com/s/1M4vcDRQCFMl8HgawXss0gA 密码:nz04
上传文件
//以二进制的形式上传文件
public static final MediaType MEDIA_TYPE_STREAM = MediaType.parse("application/octet-stream");
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
/**
* 多文件上传---Map<String, String> maps表示请求头参数
* <br/><br/>
* 文件流形式
* <br/><br/>
* 暂定传入png格式的图片
*/
public static final void postAsyncmultiFile(OkHttpClient okHttpClient, String url,
List<File> files, Map<String, String> maps,
Callback callback) {
MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);//传输类型
if (maps == null) {
for (int i = 0; i < files.size(); i++) {
QZXTools.logD("zbv", "file name="+files.get(i).getName());
if (files.get(i).getName().contains(".png") || files.get(i).getName().contains(".jpg")
|| files.get(i).getName().contains(".gif")) {
builder.addPart(Headers.of("Content-Disposition",
"form-data; name=\"file\";filename=\"file.png\""),
RequestBody.create(MEDIA_TYPE_PNG, files.get(i))
).build();
} else {
builder.addPart(Headers.of("Content-Disposition",
"form-data; name=\"file\";filename=\"" + files.get(i).getName() + "\""),
RequestBody.create(MEDIA_TYPE_STREAM, files.get(i))
).build();
}
}
} else {
for (String key : maps.keySet()) {
String str = maps.get(key);
builder.addFormDataPart(key, str);
}
for (int j = 0; j < files.size(); j++) {
long fileSize = files.get(j).length();
QZXTools.logD("zbv", "file name="+files.get(j).getName());
if (files.get(j).getName().contains(".png") || files.get(j).getName().contains(".jpg")
|| files.get(j).getName().contains(".gif")) {
builder.addPart(Headers.of("Content-Disposition",
"form-data; name=\"file\";filename=\"file.png\";filesize=" + fileSize),
RequestBody.create(MEDIA_TYPE_PNG, files.get(j))
);
} else {
builder.addPart(Headers.of("Content-Disposition",
"form-data; name=\"file\";filename=\"" + files.get(j).getName()
+ "\";filesize=" + fileSize),
RequestBody.create(MEDIA_TYPE_STREAM, files.get(j))
);
}
}
}
RequestBody requestBody = builder.build();
Request request = new Request.Builder()
.url(url)
.post(requestBody)
.build();
okHttpClient.newCall(request).enqueue(callback);
}
Post请求
/**
* okHttp---post模式enqueue---异步模式
*/
public static void postokHttpAsync(OkHttpClient okHttpClient, String url, Map<String, String> paraMap, Callback callback) {
//FormEncodingBuilder---在okHttp3中没有该类用FormBody替代
// RequestBody body=new FormBody.Builder().add("","").build();
FormBody.Builder builder = new FormBody.Builder();
//HashMap的遍历
Iterator iterator = paraMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = (Map.Entry<String, String>) iterator.next();
// logD("zbv", "key=" + entry.getKey() + ";value=" + entry.getValue());
builder.add(entry.getKey(), entry.getValue());
}
RequestBody requestBody = builder.build();
Request request = new Request.Builder().url(url).post(requestBody).build();
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
GET请求—同步和异步
/**
* okHttp---get模式enqueue---异步模式
* 如果需要下载文件的话,结果返回使用response.body().byteStream();
*/
public static void getokHttpAsync(OkHttpClient okHttpClient, String url, Callback callback) {
Request request = new Request.Builder().url(url).build();
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
/**
* okHttp---get模式execute---同步模式
*/
public static String getokHttpSync(OkHttpClient okHttpClient, String url) {
Request request = new Request.Builder().url(url).build();
//同样的取消网络请求可以使用->call.cancel();
Call call = okHttpClient.newCall(request);
Response response = null;
try {
response = call.execute();
if (response.isSuccessful()) {
String result = response.body().string();
logD("zbv", "getokHttpSync result json=" + result);
return result;
}
} catch (IOException e) {
e.printStackTrace();
logD("zbv", "getokHttpSync result code=" + response.code());
}
return null;
}
拓展post
//----------------------------------------------------------------
public static final MediaType MEDIA_TYPE_JSON = MediaType.parse("application/json; charset=utf-8");
/**
* 以json格式上传参数
* <br/><br/>
* 通过create创建requestbody
*/
public static void postAsyncJson(OkHttpClient okHttpClient, String url, String json, Callback callback) {
RequestBody requestBody = RequestBody.create(MEDIA_TYPE_JSON, json);
Request request = new Request.Builder().url(url).post(requestBody).build();
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
/**
* 上传单个文件,格式是流,传入的是文件file
* <br/><br/>
* 通过create创建requestbody
*/
public static void postSingleFile(OkHttpClient okHttpClient, String url, File file, Callback callback) {
RequestBody requestBody = RequestBody.create(MEDIA_TYPE_STREAM, file);
Request request = new Request.Builder().url(url).post(requestBody).build();
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
//----------------------------------------------------------------
设置超时以及缓存(2.0和3.0有差异)
// 响应缓存
// public CacheResponse(File cacheDirectory) throws Exception {
// int cacheSize = 10 * 1024 * 1024; // 10 MiB
// Cache cache = new Cache(cacheDirectory, cacheSize);
//
// client = new OkHttpClient();
//设置超时和缓存okHttp3.0
// File sdcache = getExternalCacheDir();
// int cacheSize = 10 * 1024 * 1024;
// OkHttpClient.Builder builder = new OkHttpClient.Builder()
// .connectTimeout(15, TimeUnit.SECONDS)
// .writeTimeout(20, TimeUnit.SECONDS)
// .readTimeout(20, TimeUnit.SECONDS)
// .cache(new Cache(sdcache.getAbsoluteFile(), cacheSize));
// OkHttpClient mOkHttpClient=builder.build();
//设置超时和缓存okhttp2.0
// client.setConnectTimeout(10, TimeUnit.SECONDS);
// client.setWriteTimeout(10, TimeUnit.SECONDS);
// client.setReadTimeout(30, TimeUnit.SECONDS);
// client.setCache(cache);