最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用OkHttp包在Android中進(jìn)行HTTP頭處理的教程

 更新時(shí)間:2016年07月13日 16:32:32   作者:HYAHU  
HTTP頭部處理是HTTP網(wǎng)絡(luò)編程中的基本操作,安卓中使用OkHttp包(github.com/square/okhttp)進(jìn)行相關(guān)操作當(dāng)然也是得心應(yīng)手,這里我們就來看一下使用OkHttp包在Android中進(jìn)行HTTP頭處理的教程

HTTP 頭處理
HTTP 頭是 HTTP 請求和響應(yīng)中的重要組成部分。在創(chuàng)建 HTTP 請求時(shí)需要設(shè)置一些 HTTP 頭。在得到 HTTP 的響應(yīng)之后,也會(huì)需要對其中包含的 HTTP 頭進(jìn)行解析。從代碼的角度來說,HTTP 頭的數(shù)據(jù)結(jié)構(gòu)是 Map<String, List<String>>類型。也就是說,對于每個(gè) HTTP 頭,可能有多個(gè)值。但是大部分 HTTP 頭都只有一個(gè)值,只有少部分 HTTP 頭允許多個(gè)值。OkHttp 采用了簡單的方式來區(qū)分這兩種類型,使得對 HTTP 頭的使用更加簡單。
在設(shè)置 HTTP 頭時(shí),使用 header(name, value) 方法來設(shè)置 HTTP 頭的唯一值。對同一個(gè) HTTP 頭,多次調(diào)用該方法會(huì)覆蓋之前設(shè)置的值。使用 addHeader(name, value) 方法來為 HTTP 頭添加新的值。在讀取 HTTP 頭時(shí),使用 header(name) 方法來讀取 HTTP 頭的最近出現(xiàn)的值。如果該 HTTP 頭只有單個(gè)值,則返回該值;如果有多個(gè)值,則返回最后一個(gè)值。使用 headers(name) 方法來讀取 HTTP 頭的所有值。
下面的代碼中使用 header 方法設(shè)置了 User-Agent 頭的值,并添加了一個(gè) Accept 頭的值。在進(jìn)行解析時(shí),通過 header 方法來獲取 Server 頭的單個(gè)值,通過 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("服務(wù)器端錯(cuò)誤: " + response);
  }

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


Synchronous Get(同步 GET)
下載一個(gè)文件,以字符串的形式打印出他的頭部信息,打印出響應(yīng)數(shù)據(jù)體信息。

String() 方法作為一些小文件的響應(yīng)數(shù)據(jù)體是非常方便和高效的。但是如果針對一些大文件的下載(大于 1MB 文件),盡量避免使用 String() 方法因?yàn)樗麜?huì)將整個(gè)文本加載到內(nèi)存中。針對這種例子優(yōu)先選擇的解決方案是將數(shù)據(jù)體作為一個(gè)數(shù)據(jù)流來處理。

 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)
在工作線程中進(jìn)行下載任務(wù),并且在響應(yīng)到達(dá)的時(shí)候采用回調(diào)的方式通知。這個(gè)回調(diào)會(huì)等待響應(yīng)信息頭準(zhǔn)備好之后發(fā)送,讀取這個(gè)響應(yīng)頭信息仍然會(huì)阻塞。目前的 OKHttp 不支持異步的 APIS 來接收處理部分的響應(yīng)體。

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());
   }
  });
 }

 

相關(guān)文章

最新評論

西畴县| 新龙县| 萨嘎县| 安庆市| 藁城市| 额敏县| 南岸区| 婺源县| 徐汇区| 厦门市| 湖南省| 工布江达县| 钦州市| 洪湖市| 金平| 大足县| 盐城市| 大英县| 呈贡县| 荣成市| 台州市| 磐安县| 屯门区| 烟台市| 华容县| 金华市| 浑源县| 赣榆县| 赞皇县| 鹤壁市| 扬州市| 获嘉县| 宁乡县| 宣城市| 布拖县| 枣强县| 万荣县| 平果县| 南安市| 来宾市| 嘉祥县|