以前对于写博客来说总觉得很麻烦 ,不过随着不断地开发工作发现写博客不仅仅可以记录自己的一些学习的知识还可以巩固自己学习的知识,对技术的理解程度也会更深,虽然开始的时间有点晚 不过坚持下去就是好的。今天主要记录一下OkHttp3.0的入门教程
一,开发环境
在android studio中导入添加
compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.squareup.okio:okio:1.11.0'
官方资料:
OkHttp官网地址:http://square.github.io/okhttp
OkHttp GitHub地址:https://github.com/square/okhttp、
二,OkHttp3.0的使用
1.同步get请求
//创建一个 OkHttpClient对象
OkHttpClient okHttpClient=new OkHttpClient();
Request request = new Request.Builder()
.url("请求的url")
.get()//发起get请求
.build();//Request.Builder()中还可以添加header,tag等方法
Response reponse = okHttpClient.newCall(request).execute(); //execute代表同步请求
String message = reponse.body().string();//获取到请求的数据
2.异步get请求
OkHttpClient okHttpClient=new OkHttpClient();
Request request = new Request.Builder()
.url("请求的url")
.get()
.build();
okHttpClient.newCall(request).enqueue(new Callback() {//enqueue代表异步
@Override
public void onFailure(Call call, IOException e) {
Log.e("okhttp", "asynGet--onFailure---" + e.toString());
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.e("okhttp", "asynGet-----获取字符串" + response.body().string());
Log.e("okhttp", "asynGet-----获取inputstream" + response.body().byteStream());
}
});
3.同步post请求
OkHttpClient okHttpClient=new OkHttpClient();
FormBody formBody = new FormBody.Builder()
.add("key", "value")//请求参数
.build();
Request request = new Request.Builder()
.url(urls)
.post(formBody)
.header("headKey", "headValue")//存值于header中
.build();
Response reponse = okHttpClient.newCall(request).execute();
String message = reponse.body().string();
Log.e("okhttp", "syncPost-----" + message);
4.异步post请求
FormBody formBody = new FormBody.Builder()
.add("key", "value")
.build();
final Request req = new Request.Builder()
.url(urls)
.post(formBody)
.header("key", "value")
.tag("zjy")//请求标记可用于取消网络请求操作
.build();
Call call = okHttpClient.newCall(req);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.e("okhttp", "asynPost-----" + response.body().string());
}
取消网络请求以上边异步post请求为例
if ("zjy".equals(call.request().tag())) {
call.cancel();//取消请求
}
在使用OKhttp请求时,onReponse回调中 不在主线程所以需要自己通过handler或者其他的方式进行对ui界面的更新
5.异步post上传文件(以文件为请求体参数上传)
OkHttpClient okHttpClient=new OkHttpClient();
MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
File file=new File("file_path");
Request request=new Request.Builder()
.url("url")
.post(RequestBody.create(MEDIA_TYPE_MARKDOWN,file))
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
6.post表单上传文件
OkHttpClient okHttpClient=new OkHttpClient();
List<File> list = new ArrayList<>();//多个文件集合
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);//设置为表单类型
builder.addFormDataPart("param", "value"); //添加表单键值
for (File file : list) { //添加多个文件
RequestBody fileBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
builder.addFormDataPart("files", file.getName(), fileBody);
}
Request request = new Request.Builder()
.url("请求的url")
.post(builder.build())
.build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
7.全局设置超时时间
okHttpClient.newBuilder()
.connectTimeout(10, TimeUnit.MINUTES)
.readTimeout(10, TimeUnit.SECONDS).build();
.writeTimeout(10, TimeUnit.SECONDS)
.Builder()
9.在测试环境下允许所有未信任的证书访问
开发中经常用到Https请求 但是在测试环境中一般都是用假证书 只有正式环境中会用到可信任的证书,所以如何在测试环境下 通过所有未认证证书从而不妨碍测试环境下测试呢
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.sslSocketFactory(createSSLSocketFactory());
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String s, SSLSession sslSession) {
return true;
}
});
okHttpClient = builder.build();
private static SSLSocketFactory createSSLSocketFactory() {
SSLSocketFactory ssfFactory = null;
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, new TrustManager[]{new TrustAllCerts()}, new SecureRandom());
ssfFactory = sc.getSocketFactory();
} catch (Exception e) {
}
return ssfFactory;
}