Android HTTP之OKHTTP的使用

一、OKHTTP简介

          Android为我们提供了两种HTTP交互的方式:HttpURLConnection 和 Apache HTTP Client,虽然两者都支持HTTPS,流的上传和下载,配置超时,IPv6和连接池,已足够满足我们各种HTTP请求的需求。但更高效的使用HTTP 可以让您的应用运行更快、更节省流量。Android上的HTTP网络栈的实现是借助于第三方的一个叫做OKHTTP的模块,OKHTTP是一个开源的模块,它有以下几个优点:

  •           OkHttp是一个高效的HTTP库:
  •           支持 SPDY ,共享同一个Socket来处理同一个服务器的所有请求
  •           如果SPDY不可用,则通过连接池来减少请求延时
  •           无缝的支持GZIP来减少数据流量
  •           缓存响应数据来减少重复的网络请求
  •           会从很多常用的连接问题中自动恢复。如果服务器配置了多个IP地址,当第一个IP连接失败的时候,OkHttp会自动 尝试下一个IP。OkHttp还处理了代理服务器问题和SSL握手失败问题。

          OKHTTP官网网址:OKHttp官网

          OKHTTP的源码下载:https://github.com/square/okhttp

二、Android的HTTP网络栈

           Android上使用HTTP的应用分为2大类,一种是通过webview控件的方式,这种方式webview再后台帮我们处理好了HTTP请求的发送、接收服务响应、解析服务器数据,以及最终的HTML页面内容的显示;另外一种是直接通过android提供的HTTP相关的类来直接实现请求的发送、状态的监听以及服务器返回数据的接收等;

          首先需要明确的是,Http通信中的POST和GET请求方式的不同。GET可以获得静态页面,也可以把参数放在URL字符串后面,传递给服务器。而POST方法的参数是放在Http请求中。在这里介绍如何使用android HTTP 协议类完成与服务器的交互,上面提到android使用HTTP的方式有2种:HttpURLConnectionHttpClient

 2.1     HttpClient

          HttpClientApache开源组织提供的HTTP网络访问接口(一个开源的项目),从名字上就可以看出,它是一个简单的HTTP客户端(并不是浏览器),可以发送HTTP请求,接受HTTP响应。但是不会缓存服务器的响应,不能执行HTTP页面中签入嵌入的JS代码,自然也不会对页面内容进行任何解析、处理,这些都是需要开发人员来完成的。

           现在Android集成了HttpClient,打开HttpClient.java,发现这其实是一个interface类,HttpClient封装了对象需要执行的Http请求、身份验证、连接管理和其它特性,既然HttpClient是一个接口,因此无法创建它的实例。从文档上看,HttpClient有三个已知的实现类分别是:AbstractHttpClient, AndroidHttpClient, DefaultHttpClient,会发现有一个专门为Android应用准备的实现类AndroidHttpClient,当然使用常规的默认类DefaultHttpClient也可以实现功能。

         DefaultHttpClient定义在package org.apache.http.impl.client下,属于对apche项目的支持。AndroidHttpClient对于DefaultHttpClient做了一些改进,使其更适用于Android项目:

  •            关掉过期检查,自连接可以打破所有的时间限制。
  •            可以设置ConnectionTimeOut(连接超时)和SoTimeout(读取数据超时)。
  •            关掉重定向。
  •            使用一个Session缓冲用于SSL Sockets
  •            如果服务器支持,使用gzip压缩方式用于在服务端和客户端传递的数据。
  •             默认情况下不保留Cookie。 

           AndroidHttpClient定义在package android.net.http下,属于Android原生的http访问,AndroidHttpClient没有公开的构造函数,只能通过静态方法newInstance()方法来获得AndroidHttpClient对象。

           使用HttpClient完成HTTP交互一般遵循一下步骤:

  •           创建代表客户端的HttpClient对象。
  •           创建代表请求的对象,如果需要发送GET请求,则创建HttpGet对象,如果需要发送POST请求,则创建HttpPost对象。注:对于发送请求的参数,GETPOST使用的方式不同,GET方式可以使用拼接字符串的方式,把参数拼接在URL结尾;POST方式需要使用setEntity(HttpEntity entity)方法来设置请求参数。
  •            调用HttpClient对象的executeHttpUriRequest request)发送请求,执行该方法后,将获得服务器返回的HttpResponse对象。
  •            调用HttpResponse的对应方法获取服务器的响应头、响应内容等

 2.1.1     DefaultHttpClient

             先看看使用DefaultHttpClient方式发送Web站点请求,上面已经简要说明了步骤,在这里简要说明一个参数的传递问题,对于GET方式,只需要拼接字符串就在URL结尾即可,但是对于POST方式,需要传递HttpEntity对象,HttpEntity为一个接口,有多个实现类,可以使用其间接子继承,UrlEncodedFormEntity类来保存请求参数,并传递给HttpPost

             GET方法的操作代码示例如下:

String httpUrl = "http://www.xxx.com/getUser.jsp?par=123";  
// HttpGet连接对象  
HttpGet httpRequest = new HttpGet(httpUrl);   
HttpClient httpclient = new DefaultHttpClient();  
HttpResponse httpResponse = httpclient.execute(httpRequest);  
// 请求成功  
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
    // 取得返回的字符串  
    String strResult = EntityUtils.toString(httpResponse.getEntity());  
    mTextView.setText(strResult);  
} else {  
    mTextView.setText("请求错误!");  
}

           使用POST方法进行参数传递时,需要使用NameValuePair来保存要传递的参数。另外,还需要设置所使用的字符集。代码如下所示:

String httpUrl = "http://www.xxx.com/getUser.jsp";    
HttpPost httpRequest = new HttpPost(httpUrl);
List<NameValuePair> params = new ArrayList<NameValuePair>();    
params.add(new BasicNameValuePair("userId", "123"));  
HttpEntity httpentity = new UrlEncodedFormEntity(params, "GB2312"); //设置字符集 
httpRequest.setEntity(httpentity); 
//取得默认的HttpClient  
HttpClient httpclient = new DefaultHttpClient();  
//取得HttpResponse  
HttpResponse httpResponse = httpclient.execute(httpRequest);  
//HttpStatus.SC_OK表示连接成功  
if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {  
    // 取得返回的字符串  
    String strResult = EntityUtils.toString(httpResponse.getEntity());  
    mTextView.setText(strResult);  
} else {  
    mTextView.setText("请求错误!");  
}

2.1.2       AndroidHttpClient

              使用AndroidHttpClient的方式和DefaultHttpClient差不多,不多的几点区别上面已经说明,但是在此例子中没有体现。有一点需要注意的是,AndroidHttpClient是一个final类,也没有公开的构造函数,所以无法使用new的形式对其进行实例化,必须使用AndroidHttpClient.newInstance()方法获得AndroidHttpClient对象。

2.2        HttpURLConnection 

          在Android6.0以上版本的系统中,HttpClient的功能被完全移除了,标志着此功能被正式弃用,现在官方建议使用的是HttpURLConnection的用法。打开HttpURLConnection.java,该类是编译在package java.net,中的,HttpURLConnection继承自URLConnection,而URLConnection是一个抽象类,所以主要的实现放在了HttpURLConnection中:

 

  •     使用HttpURLConnection完成HTTP业务的主要步骤
  •     实例化URL对象。
  •     实例化HttpUrlConnection对象。
  •     设置请求连接属性,传递参数等。
  •     获取返回码判断是否链接成功。
  •     读取输入流。
  •     关闭链接。

          使用GET方式发起HTTPHttpURLConnection默认使用GET方式,例如下面代码所示:

HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
InputStreamReader in = new InputStreamReader(urlConn.getInputStream());
BufferedReader buffer = new BufferedReader(in);
String inputLine = null;
while (((inputLine = buffer.readLine()) != null)) {
    resultData += inputLine + "\n";
}
in.close();
urlConn.disconnect();

           如果需要使用POST方式,则需要setRequestMethod设置。代码如下:

String httpUrl = "http://www.xxx.com/getUser.jsp";
String resultData = "";
URL url = null;
try {
    url = new URL(httpUrl);
} catch (MalformedURLException e) {
    Log.e(DEBUG_TAG, "MalformedURLException");
}
if (url != null) {  
    try {
        HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();  
        //因为这个是post请求,设立需要设置为true  
        urlConn.setDoOutput(true);  
        urlConn.setDoInput(true);
        urlConn.setRequestMethod("POST"); // 设置以POST方式   
        urlConn.setUseCaches(false);  
        urlConn.setInstanceFollowRedirects(true); 
        urlConn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");  
        // 这些配置必须要在connect之前完成,  
        // 要注意的是connection.getOutputStream会隐含的进行connect。  
        urlConn.connect();  
         
        // DataOutputStream流
        DataOutputStream out = new DataOutputStream(urlConn.getOutputStream());
        String content = "name=" + URLEncoder.encode("张三", "GB2312");    
        out.writeBytes(content);   
        out.flush();
        out.close();
    } catch(Exception e) {
        //
    }
}

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OkHttp是一个处理网络请求的开源项目,是Android使用最广泛的网络框架。它适用于Android 5.0(API级别21)和Java 8。使用OkHttp发送HTTP请求的过程如下: 1. 域名解析(DNS):将域名解析为IP地址。 2. 建立TCP连接:通过三次握手建立TCP连接。 3. 发起HTTP请求:建立TCP连接后,使用Socket输出流将HTTP报文写出。 4. 等待响应:等待服务器响应。 5. 解析响应:解析服务器返回的HTTP响应。 6. 处理响应数据:根据需要处理响应数据,比如解析JSON或下载文件。 在使用OkHttp时,首先需要创建一个Request对象,可以使用Request.Builder()来构建。然后通过Request对象获得一个Call对象,可以使用client.newCall(request)来创建。接下来,可以使用call.execute()进行同步调用或者call.enqueue()进行异步调用。最后,可以通过Response对象获取响应数据。 总之,使用OkHttp很简单,它的请求/响应API使用了流畅的构建器设计和不可变性设计,支持同步阻塞调用和带有回调的异步调用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [androidOkHttp使用](https://blog.csdn.net/hanjiexuan/article/details/115894233)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [android okhttp的基础使用【入门推荐】](https://download.csdn.net/download/weixin_38516386/12788438)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值