Android网络框架——OKHttp

发布于:2025-02-13 ⋅ 阅读:(47) ⋅ 点赞:(0)

目录

一、介绍

二、优势

三、功能

四、应用

1.Http Get的使用步骤

2.Http Post 携带参数的使用步骤:

3.使用post进行表单(键值对)上传


一、介绍

OKHttp是一个处理网络请求的开源项目,是安卓端最火热的轻量级框架,由移动支付Square公司贡献(该公司还贡献了Picasso) 

用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient,现在已经打不出来)

二、优势

  • 允许连接到同一个主机地址的所有请求,提高请求效率 
  • 共享Socket,减少对服务器的请求次数 
  • 通过连接池,减少了请求延迟 
  • 缓存响应数据来减少重复的网络请求 
  • 减少了对数据流量的消耗 
  • 自动处理GZip压缩 

三、功能

  • get,post请求 
  • 文件的上传下载 
  • 加载图片(内部会图片大小自动压缩) 
  • 支持请求回调,直接返回对象、对象集合 
  • 支持session的保持 

四、应用

1.Http Get的使用步骤

对于网络加载库,最常见的是http get请求了,比如获取一个网页的内容。 [3]

//1.创建OkHttpClient对象,并设置连接超时时间(读取的可写可不写)

OkHttpClient mOkHttpClient = new OkHttpClient();

注意:这种设置超时时间是OKhttp2.0特有的通过方法来进行设置

mOkHttpClient.setConnectTimeout(10,TimeUnit.SECONDS);
mOkHttpClient.setReadTimeout(10,TimeUnit.SECONDS);
mOkHttpClient.setWriteTimeout(10,TimeUnit.SECONDS);

提示:设置超时时间在OKhttp3.0以后,使用build的方式进行

OkHttpClient okHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10,TimeUnit.SECONDS)
.writeTimeout(10,TimeUnit.SECONDS)
.build();

//02.通过build来创建一个Request请求,没有设置get,而是直接设置一个url地址,默认就是一个get方式

final Request request = new Request.Builder()
.url("https://xxxx.易大师.xxxxx")
.build();

//03.创建一个call对象,参数就是Request请求对象,发送请求

Call call = mOkHttpClient.newCall(request);

//04.请求加入调度 
 call.enqueue(new Callback(){
 //请求失败执行的方法 
public void onFailure(Request request, IOException e){
} 
//请求成功执行的方法,response就是从服务器得到的参数,response.body()可以得到任意类型,字符串,字节 

public void onResponse(final Response response) throws IOException { 
//这段代码可以拿到服务器的字符串.(通过response.body还可以拿到多种数据类型) 
      //String htmlStr = response.body().string();
} 
});

get请求的步骤总结:首先构造一个Request对象,参数必须有个url参数,当然可以通过Request.Builder设置更多的参数比如:header、method等。

然后通过request的对象去构造得到一个Call对象,类似于将请求封装成了任务,既然是任务,就会有execute()和cancel()等方法。

最后,以异步的方式去执行请求,所以调用的是call.enqueue,将call加入调度队列,然后等待任务执行完成,在Callback中即可得到结果。

整体的写法还是比较长的,所以封装肯定是要做的。

okhttp注意:

onResponse回调的参数是response,一般情况下

  • 获得返回的字符串,通过response.body().string()获取;

  • 获得返回的二进制字节数组,则调用response.body().bytes();//通过二进制字节数组,可以转换为BItmap图片资源

  • 获得返回的inputStream,则调用response.body().byteStream() ;这里支持大文件下载,有inputStream可以通过IO的方式写文件。

不过也说明一个问题,这个onResponse执行的线程并不是UI线程(主线程不能有耗时操作)。如果希望操作控件,还是需要使用handler等

例如:
public void onResponse(final Response response) throws IOException { 
    final String res = response.body().string();    
    runOnUiThread(new Runnable(){ 
          public void run() {
          TextView控件对象.setText(res);
        } 
     }); 
}

这里是异步的方式去执行,也支持阻塞的方式,Call有一个execute()方法,可以直接调用call.execute()通过返回一个Response,最下面的代码就是

2.Http Post 携带参数的使用步骤:

与get请求格式基本一致,就是Request的构造的不同。基于Http的文件,字符串,键值上传 [1]

//0.0.RequestBody里所使用的上传参数的设定.(传一个字符串)
定义为成员量:JSON:MediaType JSON = MediaType.parse("application/json; charset=utf-8");
//"类型,字节码" 
 String json = "{\n" + "\"name\": \"hello.android6.0\"\n" + "}";
//就是一个字符串.      
//0.0.通过post传一个文件,非常方便.     
MediaType FIle = MediaType.parse("application/octet-stream");  
File file = new File(Environment.getExternalStorageDirectory(), "文件名.mp4");
//得到一个mp4的文件,file对象 
//01.创建OkHttpClient对象.
 OkHttpClient mOkHttpClient=new OkHttpClient(); 
//02.通过create,创建一个RequestBody(参数1:数据类型 参数2:字符串,文件,byte数组..)
RequestBody requestBody = RequestBody.create(JSON, json); //RequestBody requestBody = RequestBody.create(FIle , file );//上传一个文件的话 
//03.通过build来创建一个Request请求,需要指定post方式,并把RequestBody对象放入.
Request request = new Request.Builder() 
.url("http://XXX/易大师/YYY") 
.post(requestBody对象) 
.build();
//04.创建一个call对象( 也可以省略的为:mOkHttpClient.newCall(request).enqueue(new Callback(){.......});)
Call call = mOkHttpClient.newCall(request对象); 
 //05.请求加入调度(发送请求)
 call.enqueue(new Callback() {   
     //请求失败执行的方法 
      public void onFailure(Request request, IOException e){
} 
    //请求成功执行的方法,response就是从服务器得到的参数 
     public void onResponse(final Response response) throws IOException { 
            //String htmlStr =  response.body().string();
 } 
 }); 

注意:后面的就和上面一样了。

3.使用post进行表单(键值对)上传

(上一个使用的Create创建RequesBody)通过Builder构造RequestBody,叫做MultipartBuilder,一般用来用来上传表单(键值对) [1]

//01.创建OkHttpClient对象. 
OkHttpClient mOkHttpClient=new OkHttpClient(); 
//02.通过new FormEncodingBuilder()调用build方法,创建一个RequestBody,可以用add添加键值对 
RequestBody requestBody = new FormEncodingBuilder()         
.add("YYY", "XXX") 
.add("version", "23")
.build();
 注意:okhttp3.0以后就不能用采用FormEncodingBuilder的方式来创建表格,而是采用FormBody 
  2.通过new FormBody()调用build方法,创建一个RequestBody,可以用add添加键值对          
FormBody formBody = new FormBody.Builder()
 .add("XXX",易大师)
 .add("YYY",YCF) 
 .build(); 
 //03.通过build来创建一个Request请求,需要指定post方式,并把RequestBody对象放入         
Request request = new Request.Builder()                 
 .url("http://XXX/易宸锋/YYY")                
 .post(requestBody对象)    
 .build(); 
//04.创建一个call对象( 也可以省略的为:mOkHttpClient.newCall(request).enqueue(new Callback(){.......});) 
 Call call = mOkHttpClient.newCall(request对象); 
//05.请求加入调度(发送请求) 
 call.enqueue(new Callback()   {    
//请求失败执行的方法 
 public void onFailure(Request request, IOException e){
} 
//请求成功执行的方法,response就是从服务器得到的参数 public void onResponse(final Response response) throws IOException{                 
//String htmlStr =  response.body().string(); 
            } 
    }); 

参考文章

okhttp_百度百科