OkHttp基本使用

  OkHttp介绍
  
  Android系统提供了两种HTTP通讯类,HttpURLConnection和HttpClient,HttpURLConnection相对来讲比HttpClient难用,google自从2.3版本以后一直推荐使用HttpURLConnection,而且在6.0版本的sdk中直接删掉了HttpClient类。
  
  可是, 上面两个类库和OkHttp比起来就弱爆了, 由于OkHttp不只具备高效的请求效率,而且节省宽带, 还提供了不少开箱即用的网络疑难杂症解决方案.(听说Android4.4的源码中能够看到OkHttp替换了HttpURLConnection)
  
  支持HTTP/2, HTTP/2经过使用多路复用技术在一个单独的TCP链接上支持并发, 经过在一个链接上一次性发送多个请求来发送或接收数据
  
  若是HTTP/2不可用, 链接池减小请求延迟
  
  支持GZIP, 能够压缩下载体积
  
  响应缓存能够避免重复请求网络
  
  会从不少经常使用的链接问题中自动恢复,若是您的服务器配置了多个IP地址,当第一个IP链接失败的时候,OkHttp会自动尝试下一个IP
  
  OkHttp还处理了代理服务器问题和SSL握手失败问题
  
  OkHttp基本使用
  
  概述
  
  前面的内容介绍了OkHttp,本章就来教你们okhttp的基本使用,学了这些基本东西以后,你们有其余的需求能够自行扩展。如下的全部请求都是异步请求服务器,在真实的企业开发中,基本都是异步。
  
  get请求
  
  post请求
  
  文件上传
  
  依赖
  
  Android Studio能够在线依赖,在app/build.gradle文件中加上下面这句话就行
  
  compile 'com.squareup.okhttp3:okhttp:3.8.0'
  
  1
  
  1
  
  get请求
  
  首先须要建立一个全局的OkHttpClient对象,全部的Http请求都共用这个对象就行。
  
  private OkHttpClient client = new OkHttpClient();
  
  1
  
  1
  
  通常从服务器获取信息的接口都是get请求,这里咱们调用获取用户信息接口。
  
  private void getUserInfo(){
  
  //建立一个Request
  
  Request.Builder builder = new Request.Builder().url("http://139.196.35.30:8080/OkHttpTest/getUserInfo.do");
  
  execute(builder);
  
  }
  
  //执行请求
  
  private void execute(Request.Builder builder){
  
  Call call = client.newCall(builder.build());
  
  call.enqueue(callback);//加入调度队列
  
  }
  
  //请求回调
  
  private Callback callback=new Callback(){
  
  @Override
  
  public void onFailure(Call call, IOException e) {
  
  Log.i("MainActivity","onFailure");
  
  e.printStackTrace();
  
  }
  
  @Override
  
  public void onResponse(Call call, Response response) throws IOException {
  
  //从response从获取服务器返回的数据,转成字符串处理
  
  String str = new String(response.body().bytes(),"utf-8");
  
  Log.i("MainActivity","onResponse:"+str);
  
  //经过handler更新UI
  
  Message message=handler.obtainMessage();
  
  message.obj=str;
  
  message.sendToTarget();
  
  首先建立一个request对象,经过request设置请求url,经过这个类还能够设置更多的请求信息。
  
  而后经过Request去构造一个Call对象。
  
  调用enqueue执行异步请求,有一个参数设置回调。请求成功或者失败会调用Callback接口的onResponse跟onFailure方法,由于这是异步请求,在回调方法中是不能直接更新UI,因此咱们须要经过Handler去更新UI。
  
  handler的代码很简单,就是把请求的结果显示在TextView上
  
  private Handler handler=new Handler(){
  
  @Override
  
  public void handleMessage(Message msg) {
  
  String result= (String) msg.obj;
  
  tvResult.setText(result);
  
  }
  
  Post请求
  
  经过调用登陆接口发送一个post请求。跟get不同的地方就是传参数不同,post请求须要把参数封装到RequestBody对象,调用Request对象的post方法把RequestBody传入进去。最后调用execute方法执行请求,这个方法前面get请求的时候讲过。
  
  private void login(){
  
  //把请求参数封装到RequestBody里面
  
  FormBody.Builder formBuilder = new FormBody.Builder();
  
  formBuilder.add("username","ansen");//请求参数一
  
  formBuilder.add("password","123");//请求参数二
  
  RequestBody requestBody = formBuilder.build();
  
  Request.Builder builder = new Request.Builder().url("http://139.196.35.30:8080/OkHttpTest/login.do").post(requestBody);
  
  execute(builder);
  
  文件上传
  
  上传文件须要用到MultipartBody对象,经过调用addFormDataPart方法添加表单参数,经过setType方法设置内容类型,这边设置form表单类型,调用本身的getUploadFileBytes方法获取文件byte数组,经过addFormDataPart方法添加文件,后面的流程跟以前的post请求同样。
  
  private void uploadFile(){
  
  MultipartBody.Builder builder = new MultipartBody.Builder();
  
  builder.addFormDataPart(http://www.acnet.cn/"username", "ansen");//表单参数
  
  builder.addFormDataPart(www.sb45475.com "password", "123456");//表单参数
  
  builder.setType(MultipartBody.FORM);
  
  MediaType mediaType = MediaType.parse("application/octet-stream");
  
  byte[] bytes=getUploadFileBytes();//获取文件内容存入byte数组
  
  //上传文件 参数1:name 参数2:文件名称 参数3:文件byte数组
  
  builder.addFormDataPart("upload_http://www.22yigouyule.cn/ file", "ansen.txt",RequestBody.create(mediaType,bytes));
  
  RequestBody requestBody = builder.build();
  
  Request.Builder requestBuider = new Request.Builder(www.22yigouyule.cn/);
  
  requestBuider.url("http://139.196.huazongyulept.cn 35.30:8080/OkHttpTest/uploadFile.do");
  
  requestBuider.post(requestBody);
  
  execute(requestBuider);
  
  如何证实文件有上传到服务器呢?打开浏览器,输入下面这个地址,就能看到文件内容了。若是是本地服务器记得把139.196.35.30改为localhost。
  
  http://139.196.35.30:8080/http://xucaizxyl.com/ OkHttpTest/upload/ansen.txt
  
  1
  
  1
  
  经过http协议请求服务器数据,经常使用的就这几种请求,若是有特殊需求本身扩展。例如:下载文件,从服务器下载图片等。。。。
  
  服务器接口
  
  这三个接口的服务器代码是我本身用Java web写的,开发工具用的是IntelliJ IDEA,服务器是tomcat,我部署在云上了,139.196.35.30是个人云服务器的外网ip,你们测试也方便。服务器代码我放github上了,若是你想扩展接口,或者想看源码都很方便。
  
  源码下载
  
  服务器源码
  
  Android客户端源码git

相关文章
相关标签/搜索