Android OKHttp3的初级使用
前言
大家都知道,app主要的一个功能就是以数据处理与后台交互,以数据展示与用户交互,那就必然需要使用到网络请求,先接触的网络框架有google推荐的volley,用的比较久,当然还有一些第三方的一些框架,一直用的就是volley,直到去年的时候开始了解到,Retriofit+RxJava组合使用写网络框架不少人推荐,而Retriofi的底层就是OKHttp,个人建议想要学好Retriofit的,最好先了解一下它的基础OKHttp,它的效果性能非常不错,现在已经到是OKHttp3.5版本了。如果你已经了解OKHttp,请帮忙指出文中的不足之处或忽略此文,谢谢。
具体使用
1. 添加配置
compile 'com.squareup.okhttp3:okhttp:3.5.0'
<uses-permission android:name="android.permission.INTERNET" />
2. 使用方法
2.1.1 GET(同步)
public void getRequest(String url){
//创建OKHttpClient对象,
OKHttpClient client = new OKHttpClient();
//创建Request对象,至少要设置请求访问的url
Request request = new Request.Builder().url(url).build();
//创建Call对象,创建一个新的请求任务,参数是request对象
Call call = client.newCall(request);
try{
//执行请求,会阻塞当前线程
Response response = call.execute();
if(response.isSuccessful()){
Log.e("response",response.body().string);
}
}catch(IOException e){
e.printStackTrace;
}
}
2.1.2 GET(异步)
public void getAynscRequest(String url){
//如果要带参数的话
//httpUrl=HttpUrl.parse("https://free-api.heweather.com/v5/now")
//.newBuilder()
//.addQueryParameter("city","杭州")
//.addQueryParameter("key"," 84fe66e07e5d449fb8fd687ccb3499a0")
//.build();
//创建OKHttpClient对象,
OKHttpClient client = new OKHttpClient();
//创建Request对象,至少要设置请求访问的url
Request request = new Request.Builder().url(url).build();
//创建Call对象,创建一个新的请求任务,参数是request对象
Call call = client.newCall(request);
//将请求加入队列,参数Callback监听,
Response response = call.enqueue(new Callback(){
@Override
public void onFailure(Call call,IOException e){
Log.e("onFailure","请求失败");
}
@Override
public void onSuccess(Call call,Response response)
throws IOException{
if(response.isSuccessful()){
Log.e("onSuccess",response.body().string);
}
});
}
GET返回的response可以获取到InputStream对象(body().byteStream()),然后做写文件操作即可实现文件下载。
2.2.1 Post(同步)
public void postRequest(String url){
//创建OKHttpClient对象,
OKHttpClient client = new OKHttpClient();
//创建Form表单对象,可以add多个键值队
FormBody formBody = new FormBody.Builder()
.add("key","84fe66e07e5d449fb8fd687ccb3499a0")
.add("city","杭州")
.build();
//创建Request对象,至少要设置请求访问的url,和post对象
Request request = new Request.Builder()
.url(url)
.post(formBody)
.build();
//创建Call对象,创建一个新的请求任务,参数是request对象
Call call = client.newCall(request);
try{
//执行请求,会阻塞当前线程
Response response = call.execute();
if(response.isSuccessful()){
Log.e("response",response.body().string);
}
}catch(IOException e){
e.printStackTrace;
}
}
2.2.1 Post(异步)
public void postRequest(String url){
//创建OKHttpClient对象,
OKHttpClient client = new OKHttpClient();
//创建Form表单对象,可以add多个键值队
FormBody formBody = new FormBody.Builder()
.add("key","84fe66e07e5d449fb8fd687ccb3499a0")
.add("city","杭州")
.build();
//创建Request对象,至少要设置请求访问的url,和post对象
Request request = new Request.Builder()
.url(url)
.post(formBody)
.build();
//创建Call对象,创建一个新的请求任务,参数是request对象
Call call = client.newCall(request);
//执行请求,会阻塞当前线程
Response response = call.enqueue(new Callback(){
@Override
public void onFailure(Call call,IOException e){
Log.e("okhttp","Fail");
}
@Override
public void onResponse(Call call,Response response)
throws IOException{
Logger.init("okhttp");
Logger.json(response.body().string());
}
}
2.3.1 多文件上传
public void Upload(String url){
//多个文件集合
List<File> filelist = new ArrayList<>();
MultipartBody.Builder builder = new MultipartBody.Builder();
//设置表单类型
builder.setType(MultipartBody.FORM);
//添加表单参数,看你自己实际的接口需要多少个
builder.addFormDataPart("name","value");
for(File file: filelist){
//添加多个文件
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 client = new OKHttpClient();
//发起异步请求上传文件
client.newCall(request).enqueue(new Callback(){
@Override
public void onFailure(Call call,IOException e){
Log.e("okHttp","fail");
}
@Override
public void onResponse(Call call,Response response)
throws IOException{
Logger.init("okHttp");
Logger.json(response.body().string());
}
});
}
3. 小结
本文是针对OKHttp3一些常用的get,post等,算是学习okhttp3的入门资料,有一些关于设置没有列举出来,比如设置连接时长等,细细看一下OKHttpClient下面的方法就知道了,后面要学的还很多,如缓存,封装。如有不对的地方,感谢指出。