【http】HttpComponents —— HTTP请求
文章目录
- 请求的URI
HTTP请求拦截器
所有HTTP请求有一个组合了方法名,请求URI和HTTP协议版本的请求行。
HttpClient支持所有定义在HTTP/1.1版本中的HTTP方法:GET,HEAD,POST,PUT,DELETE,TRACE和OPTIONS。对于每个方法类型都有一个特殊的类:HttpGet
,HttpHead
,HttpPost
,HttpPut
,HttpDelete
,HttpTrace
和HttpOptions
。
请求的URI
请求的URI是统一资源定位符,它标识了应用于哪个请求之上的资源。HTTP请求URI包含一个协议模式,主机名称,可选的端口,资源路径,可选的查询和可选的片段。
HttpGet httpGet = new HttpGet(
"http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=");
HttpClient提供很多工具方法来简化创建和修改执行URI。URI也可以编程来拼装:
URIBuilder builder = new URIBuilder();
builder.setScheme("http"); // http://
builder.setHost("www.baidu.com"); // www.baidu.com
builder.setPath("/s"); // /s
builder.setFragment("foo"); // #foo
builder.setQuery("wd=查询测试"); // ?wd=查询测试
// http://www.baidu.com/s?wd=查询测试#foo
System.out.println(builder.build());
查询字符串也可以从独立的参数中来生成:
List<NameValuePair> qParams = new ArrayList<NameValuePair>();
qParams.add(new BasicNameValuePair("wd", "测试查询"));
URI uri = new URI("http://www.baidu.com/s ?"
+ URLEncodedUtils.format(qParams, "GBK"));
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI());
HTTP请求拦截器
HTTP协议拦截器是一个实现了特定HTPP协议方面的惯例。通常协议拦截器希望作用于一个特定头部信息上,或者一族收到报文的相关头部信息,或使用一个特定的头部或一族相关的头部信息填充发出的报文。协议拦截器也可以操纵包含在报文中的内容实体,透明的内容压缩/解压就是一个很好的示例。通常情况下这是由包装器实体类使用了“装饰者”模式来装饰原始的实体完成的。一些协议拦截器可以从一个逻辑单元中来结合。
协议拦截器也可以通过共享信息来共同合作-比如处理状态-通过HTTP执行上下文。协议拦截器可以使用HTTP内容来为一个或多个连续的请求存储一个处理状态。
通常拦截器执行的顺序不应该和它们基于的特定执行上下文状态有关。如果协议拦截器有相互依存关系,那么它们必须按特定顺序来执行,正如它们希望执行的顺序一样,它们应该在相同的序列中被加到协议处理器。
协议拦截器必须实现为线程安全的。和Servlet相似,协议拦截器不应该使用实例变量,除非访问的那些变量是同步的。
这个示例给出了本地内容在连续的请求中怎么被用于持久一个处理状态的:
DefaultHttpClient client = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
AtomicInteger count = new AtomicInteger(1);
localContext.setAttribute("count", count);
client.addRequestInterceptor(new HttpRequestInterceptor() {
public void process(final HttpRequest request, final HttpContext context)
throws HttpException, IOException {
AtomicInteger count = (AtomicInteger) context.getAttribute("count");
request.addHeader("Count", Integer.toString(count.getAndIncrement()));
}
});
HttpGet httpget = new HttpGet("http://localhost/");
for (int i = 0; i < 10; i++) {
HttpResponse response = client.execute(httpget, localContext);
HttpEntity entity = response.getEntity();
if (entity != null) {
EntityUtils.consume(entity);
}
}
转载链接:http://www.voidcn.com/article/p-wcdjywrl-nh.html
还没有评论,来说两句吧...