使用OkHttp包在Android中进行HTTP头处理的教程

 更新时间:2016年07月13日 16:32:32   转载 作者:HYAHU  
HTTP头部处理是HTTP网络编程中的基本操作,安卓中使用OkHttp包(github.com/square/okhttp)进行相关操作当然也是得心应手,这里我们就来看一下使用OkHttp包在Android中进行HTTP头处理的教程

HTTP 头处理
HTTP 头是 HTTP 请求和响应中的重要组成部分。在创建 HTTP 请求时需要设置一些 HTTP 头。在得到 HTTP 的响应之后,也会需要对其中包含的 HTTP 头进行解析。从代码的角度来说,HTTP 头的数据结构是 Map<String, List<String>>类型。也就是说,对于每个 HTTP 头,可能有多个值。但是大部分 HTTP 头都只有一个值,只有少部分 HTTP 头允许多个值。OkHttp 采用了简单的方式来区分这两种类型,使得对 HTTP 头的使用更加简单。
在设置 HTTP 头时,使用 header(name, value) 方法来设置 HTTP 头的唯一值。对同一个 HTTP 头,多次调用该方法会覆盖之前设置的值。使用 addHeader(name, value) 方法来为 HTTP 头添加新的值。在读取 HTTP 头时,使用 header(name) 方法来读取 HTTP 头的最近出现的值。如果该 HTTP 头只有单个值,则返回该值;如果有多个值,则返回最后一个值。使用 headers(name) 方法来读取 HTTP 头的所有值。
下面的代码中使用 header 方法设置了 User-Agent 头的值,并添加了一个 Accept 头的值。在进行解析时,通过 header 方法来获取 Server 头的单个值,通过 headers 方法来获取 Set-Cookie 头的所有值。

public class Headers {
  public static void main(String[] args) throws IOException {
  OkHttpClient client = new OkHttpClient();

  Request request = new Request.Builder()
      .url("http://www.baidu.com")
      .header("User-Agent", "My super agent")
      .addHeader("Accept", "text/html")
      .build();

  Response response = client.newCall(request).execute();
  if (!response.isSuccessful()) {
    throw new IOException("服务器端错误: " + response);
  }

  System.out.println(response.header("Server"));
  System.out.println(response.headers("Set-Cookie"));
  }
}


Synchronous Get(同步 GET)
下载一个文件,以字符串的形式打印出他的头部信息,打印出响应数据体信息。

String() 方法作为一些小文件的响应数据体是非常方便和高效的。但是如果针对一些大文件的下载(大于 1MB 文件),尽量避免使用 String() 方法因为他会将整个文本加载到内存中。针对这种例子优先选择的解决方案是将数据体作为一个数据流来处理。

 private final OkHttpClient client = new OkHttpClient();

 public void run() throws Exception {
  Request request = new Request.Builder()
    .url("http://publicobject.com/helloworld.txt")
    .build();

  Response response = client.newCall(request).execute();
  if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

  Headers responseHeaders = response.headers();
  for (int i = 0; i < responseHeaders.size(); i++) {
   System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
  }

  System.out.println(response.body().string());
 }

Asynchronous Get(异步 GET)
在工作线程中进行下载任务,并且在响应到达的时候采用回调的方式通知。这个回调会等待响应信息头准备好之后发送,读取这个响应头信息仍然会阻塞。目前的 OKHttp 不支持异步的 APIS 来接收处理部分的响应体。

private final OkHttpClient client = new OkHttpClient();

 public void run() throws Exception {
  Request request = new Request.Builder()
    .url("http://publicobject.com/helloworld.txt")
    .build();

  client.newCall(request).enqueue(new Callback() {
   @Override public void onFailure(Request request, IOException throwable) {
    throwable.printStackTrace();
   }

   @Override public void onResponse(Response response) throws IOException {
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

    Headers responseHeaders = response.headers();
    for (int i = 0; i < responseHeaders.size(); i++) {
     System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
    }

    System.out.println(response.body().string());
   }
  });
 }

 

相关文章

  • Android 广播大全 Intent Action 事件详解

    Android 广播大全 Intent Action 事件详解

    这篇文章主要给大家介绍Android 广播大全 Intent Action 事件详解,涉及到android广播action 方面知识点,本文讲解的非常的全面,感兴趣的朋友一起看看吧
    2015-10-10
  • Android Retrofit 中文乱码问题的解决办法

    Android Retrofit 中文乱码问题的解决办法

    这篇文章主要介绍了Android Retrofit 中文乱码问题的解决办法的相关资料,希望通过本文能帮助到大家,让大家遇到这种问题及时的解决,需要的朋友可以参考下
    2017-10-10
  • android实现状态栏添加图标的函数实例

    android实现状态栏添加图标的函数实例

    这篇文章主要介绍了android实现状态栏添加图标的函数,较为详细的分析了Android状态栏添加及删除图标的具体实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Android4.4下MediaProvider无法向外置SD卡中文件写数据的解决方法

    Android4.4下MediaProvider无法向外置SD卡中文件写数据的解决方法

    这篇文章主要介绍了Android4.4下MediaProvider无法向外置SD卡中文件写数据的解决方法,实例分析了Android4.4下针对读写限制的修改技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Android 后台生成长图并分享示例(非长截图)

    Android 后台生成长图并分享示例(非长截图)

    这篇文章主要介绍了Android 后台生成长图并分享示例(非长截图),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Android仿淘宝订单页面效果

    Android仿淘宝订单页面效果

    这篇文章主要介绍了Android仿淘宝订单页面效果,电商项目的订单管理模块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 深入浅析Android消息机制

    深入浅析Android消息机制

    在Android中,线程内部或者线程之间进行信息交互时经常会使用消息,这些基础的东西如果我们熟悉其内部的原理,将会使我们容易、更好地架构系统,避免一些低级的错误,通过本文给大家介绍android消息机制,感兴趣的朋友一起学习吧
    2016-04-04
  • Android实现简易版打地鼠

    Android实现简易版打地鼠

    这篇文章主要为大家详细介绍了Android实现简易版打地鼠,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • android编程获取和设置系统铃声和音量大小的方法

    android编程获取和设置系统铃声和音量大小的方法

    这篇文章主要介绍了android编程获取和设置系统铃声和音量大小的方法,实例分析了Android针对音频的相关操作技巧,需要的朋友可以参考下
    2017-06-06
  • Android编程之json解析实例详解

    Android编程之json解析实例详解

    这篇文章主要介绍了Android编程之json解析,结合实例形式较为详细的分析了了Android针对json格式数据的创建、读取与解析技巧,需要的朋友可以参考下
    2015-12-12

最新评论