使用OkHttp

首先就是导依赖:

compile 'com.zhy:okhttputils:2.0.0'

HttpURLConnection和OkHttp的比较

● HttpURLConnection有的API,OkHttp基本上都有(你有我有全都有呀,哈哈哈)
● HttpURLConnection和OkHttp都支持Https,流的上传和下载,超时,IP6、连接池等等
● OkHttp比HttpURLConnection具有更好的同步异步请求、缓存机制,支持HttpDNS、重定向、Gzip压缩,平台适应性、很好的服务器IP的转换、直接Socket通信,支持拦截器等等。

看到这么多机制,是不是觉得很强大,通过Socket直接通信,以及很好的缓存机制,Gzip对于Http头部的压缩传输。自然对于网络请求这块使应用更加省流量、请求的更快。OkHttp对于Https和HttpDNS的支持,使得应用的网络通信安全性更高。当然说了它的好,现在也来说说它的不好之处:

● OkHttp不支持优先级请求
● OkHttp不支持自签名证书
● OkHttp header中不能传中文

虽然是不好的地方,但是OkHttp已经比较成熟了,网上解决这几个问题的资料也很多了。所以这些都不是问题。

一个简单的Get请求例子

这里我们就以经典的官网提供的Get请求的例子来学习下,说大概的代码。
● 先在manifest加个网络权限,养成良好习惯

<uses-permission android:name="android.permission.INTERNET"/>

然后在build.gradle文件的dependencies添加库如下:

dependencies {
    compile 'com.squareup.okhttp3:okhttp:3.2.0'
    compile 'com.squareup.okio:okio:1.7.0'
}

同步Get请求:

final OkHttpClient okHttpClient = new OkHttpClient()
           .newBuilder()
           .build();
   final Request request = new Request.Builder()
           .url("https://www.publicobject.com/helloworld.txt")
           .header("User-Agent","OkHttp Example")
           .build();
   new Thread(new Runnable() {
       @Override
       public void run() {
           try {
               Response response = okHttpClient.newCall(request).execute();
               Log.d("zgx","response====="+response.body().string());
               response.body().close();
           } catch (IOException e) {
               e.printStackTrace();
           }
       }
   }).start();

一些基本的知识

  • Http

Http是一种基于TCP/IP连接的一套网络通信协议,它是一种一应一答的请求,它分为Get和Post请求,Get请求获取得是静态页面,它可以把参数放在URL字符串后面。而Post请求就不同了,它是把参数放在Http请求的正文的。
Get请求我们会这样请求:

private void HttpURLConnection_Get(){  
        try{  
            //通过openConnection 连接  
            URL url = new java.net.URL(URL);  
            urlConn=(HttpURLConnection)url.openConnection();  
            //设置输入和输出流   
            urlConn.setDoOutput(true);  
            urlConn.setDoInput(true);  
            //关闭连接  
            urlConn.disconnect();  
        }catch(Exception e){  
            resultData = "连接超时";  
        }  
    } 

然后把获取到的urlConn连接的数据通过IO流把读取出来:

InputStreamReader in = new InputStreamReader(urlConn.getInputStream());    
                   BufferedReader buffer = new BufferedReader(in);    
                   String inputLine = null;    
                   while (((inputLine = buffer.readLine()) != null)){  
                       resultData += inputLine + "\n";    
                   }  
                   System.out.println(resultData);  
                   in.close();

Post请求则会这样:

private void HttpURLConnection_Post(){  
      try{  
          //通过openConnection 连接  
          URL url = new java.net.URL(URL_Post);  
          urlConn=(HttpURLConnection)url.openConnection();  
          //设置输入和输出流   
          urlConn.setDoOutput(true);  
          urlConn.setDoInput(true);  

          urlConn.setRequestMethod("POST");  
          urlConn.setUseCaches(false);  
          // 配置本次连接的Content-type,配置为application/x-www-form-urlencoded的    
          urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");    
          // 连接,从postUrl.openConnection()至此的配置必须要在connect之前完成,  
          // 要注意的是connection.getOutputStream会隐含的进行connect。    
          urlConn.connect();  
          //DataOutputStream流  
          DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());  
          //要上传的参数  
          String content = "par=" + URLEncoder.encode("ylx_Post+中正", "UTF_8");   
          //将要上传的内容写入流中  
          out.writeBytes(content);     
          //刷新、关闭  
          out.flush();  
          out.close();     

      }catch(Exception e){  
          resultData = "连接超时";  
      }  
  } 

然后同上把获取到的urlConn连接的数据通过IO流把读取出来,大概的代码就是这样。

  • 缓存处理

先来看看OkHttp的缓存怎么设置

int cacheSize = 10 * 1024 * 1024; // 10 MiB
  //cacheDirectory保存缓存的目录,cacheSize缓存空间的大小
  Cache cache = new Cache(context.getCacheDir(), cacheSize);
  final OkHttpClient okHttpClient = new OkHttpClient()
          .newBuilder()
          .cache(cache)
          .build();
大胖倪的慢灵魂 wechat
感觉有用打赏一个呗~