OkHttp是Square出的Http通讯库,支持HTTP和HTTP/2,用于Android应用和Java应用。
OkHttp是非常优秀的Http通讯库,将Http连接中各种繁杂的问题,对并发的支持,对常见异常的处理等封装在底层,提供简单易用的API供应用中调用。与之相比,HttpUrlConnection的使用过于复杂,Appache的HttpClient在Android平台上的运行又有各种问题,在Android 6.0之后,已经将HttpClient库从SDK中删除,全面转向使用OkHttp。
目前有很多知名的Android三方框架都使用OkHttp作为网络连接的默认基栈,例如Volley,Glide,Retrofit等,从中也能看出学习OkHttp的必要性。
maven依赖
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId><version>3.6.0</version>
</dependency>
public class OkhttpUtil {
private static final Logger log = Logger.getLogger(OkhttpUtil.class);
private static final OkHttpClient httpClient = new OkHttpClient();
public static final MediaType JSON = MediaType.parse("application/json; charset=UTF-8");
public static final MediaType MediaTypeFlie = MediaType.parse("application/json; charset=UTF-8");
/**
* 不会开启异步线程。
*
* @param request
* @return
* @throws IOException
*/
public static Response execute(Request request) throws IOException {
return httpClient.newCall(request).execute();
}
/**
* 开启异步线程访问网络
*
* @param request
* @param responseCallback
*/
public static void enqueue(Request request, Callback responseCallback) {
httpClient.newCall(request).enqueue(responseCallback);
}
/**
* 开启异步线程访问网络, 且不在意返回结果(实现空callback)
*
* @param request
*/
public static void enqueue(Request request) {
httpClient.newCall(request).enqueue(new Callback() {
public void onFailure(Call call, IOException e) {
log.debug("Call:" + call, e);
}
public void onResponse(Call call, Response rep) throws IOException {
log.debug("Call:" + call + ",Response:" + rep);
}
});
}
public static String doGetHttpRequest(String url) throws IOException {
Request request = new Request.Builder().url(url).build();
Response response = execute(request);
if (!response.isSuccessful()) {
throw new IOException("Server Connection Failed:" + response);
}
return response.body().string();
}
public static String doPostHttpRequest(String url, String json) {
Request request = new Request.Builder().url(url).post(RequestBody.create(JSON, json)).build();
try {
Response response = execute(request);
if (!response.isSuccessful()) {
System.out.println("Server Connection Failed:" + response);
}
return response.body().string();
} catch (IOException e) {
System.out.println(e.getMessage());
e.printStackTrace();
return null;
}
}
/**
* 文件上传 OKHttpUtil
*
* @return String
*
*/
public static String upLoad(String url,String fileName, String path) {
File file = new File(path, fileName);
RequestBody fileBody = RequestBody.create(MediaTypeFlie, file);
RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("image", fileName, fileBody).build();
Request request = new Request.Builder().url(url).post(requestBody).build();
final okhttp3.OkHttpClient.Builder httpBuilder = new OkHttpClient.Builder();
OkHttpClient okHttpClient = httpBuilder// 设置超时
.connectTimeout(10, TimeUnit.SECONDS).writeTimeout(15, TimeUnit.SECONDS).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
log.error("uploadMultiFile() e=" + e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
log.error("uploadMultiFile() response=" + response.body().string());
}
});
return "success";
}