使用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头的所有值。
publicclassHeaders{ publicstaticvoidmain(String[]args)throwsIOException{ OkHttpClientclient=newOkHttpClient(); Requestrequest=newRequest.Builder() .url("http://www.baidu.com") .header("User-Agent","Mysuperagent") .addHeader("Accept","text/html") .build(); Responseresponse=client.newCall(request).execute(); if(!response.isSuccessful()){ thrownewIOException("服务器端错误:"+response); } System.out.println(response.header("Server")); System.out.println(response.headers("Set-Cookie")); } }
SynchronousGet(同步GET)
下载一个文件,以字符串的形式打印出他的头部信息,打印出响应数据体信息。
String()方法作为一些小文件的响应数据体是非常方便和高效的。但是如果针对一些大文件的下载(大于1MB文件),尽量避免使用String()方法因为他会将整个文本加载到内存中。针对这种例子优先选择的解决方案是将数据体作为一个数据流来处理。
privatefinalOkHttpClientclient=newOkHttpClient(); publicvoidrun()throwsException{ Requestrequest=newRequest.Builder() .url("http://publicobject.com/helloworld.txt") .build(); Responseresponse=client.newCall(request).execute(); if(!response.isSuccessful())thrownewIOException("Unexpectedcode"+response); HeadersresponseHeaders=response.headers(); for(inti=0;i<responseHeaders.size();i++){ System.out.println(responseHeaders.name(i)+":"+responseHeaders.value(i)); } System.out.println(response.body().string()); }
AsynchronousGet(异步GET)
在工作线程中进行下载任务,并且在响应到达的时候采用回调的方式通知。这个回调会等待响应信息头准备好之后发送,读取这个响应头信息仍然会阻塞。目前的OKHttp不支持异步的APIS来接收处理部分的响应体。
privatefinalOkHttpClientclient=newOkHttpClient(); publicvoidrun()throwsException{ Requestrequest=newRequest.Builder() .url("http://publicobject.com/helloworld.txt") .build(); client.newCall(request).enqueue(newCallback(){ @OverridepublicvoidonFailure(Requestrequest,IOExceptionthrowable){ throwable.printStackTrace(); } @OverridepublicvoidonResponse(Responseresponse)throwsIOException{ if(!response.isSuccessful())thrownewIOException("Unexpectedcode"+response); HeadersresponseHeaders=response.headers(); for(inti=0;i<responseHeaders.size();i++){ System.out.println(responseHeaders.name(i)+":"+responseHeaders.value(i)); } System.out.println(response.body().string()); } }); }