【http】HttpComponents —— HTTP请求

深藏阁楼爱情的钟 2022-11-16 13:59 318阅读 0赞

文章目录

  • 请求的URI
  • HTTP请求拦截器

    所有HTTP请求有一个组合了方法名,请求URI和HTTP协议版本的请求行。

HttpClient支持所有定义在HTTP/1.1版本中的HTTP方法:GET,HEAD,POST,PUT,DELETE,TRACE和OPTIONS。对于每个方法类型都有一个特殊的类:HttpGetHttpHeadHttpPostHttpPutHttpDeleteHttpTraceHttpOptions

请求的URI

请求的URI是统一资源定位符,它标识了应用于哪个请求之上的资源。HTTP请求URI包含一个协议模式,主机名称,可选的端口,资源路径,可选的查询和可选的片段。

  1. HttpGet httpGet = new HttpGet(
  2. "http://www.google.com/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=");

HttpClient提供很多工具方法来简化创建和修改执行URI。URI也可以编程来拼装:

  1. URIBuilder builder = new URIBuilder();
  2. builder.setScheme("http"); // http://
  3. builder.setHost("www.baidu.com"); // www.baidu.com
  4. builder.setPath("/s"); // /s
  5. builder.setFragment("foo"); // #foo
  6. builder.setQuery("wd=查询测试"); // ?wd=查询测试
  7. // http://www.baidu.com/s?wd=查询测试#foo
  8. System.out.println(builder.build());

查询字符串也可以从独立的参数中来生成:

  1. List<NameValuePair> qParams = new ArrayList<NameValuePair>();
  2. qParams.add(new BasicNameValuePair("wd", "测试查询"));
  3. URI uri = new URI("http://www.baidu.com/s ?"
  4. + URLEncodedUtils.format(qParams, "GBK"));
  5. HttpGet httpget = new HttpGet(uri);
  6. System.out.println(httpget.getURI());

HTTP请求拦截器

HTTP协议拦截器是一个实现了特定HTPP协议方面的惯例。通常协议拦截器希望作用于一个特定头部信息上,或者一族收到报文的相关头部信息,或使用一个特定的头部或一族相关的头部信息填充发出的报文。协议拦截器也可以操纵包含在报文中的内容实体,透明的内容压缩/解压就是一个很好的示例。通常情况下这是由包装器实体类使用了“装饰者”模式来装饰原始的实体完成的。一些协议拦截器可以从一个逻辑单元中来结合。

  1. 协议拦截器也可以通过共享信息来共同合作-比如处理状态-通过HTTP执行上下文。协议拦截器可以使用HTTP内容来为一个或多个连续的请求存储一个处理状态。
  2. 通常拦截器执行的顺序不应该和它们基于的特定执行上下文状态有关。如果协议拦截器有相互依存关系,那么它们必须按特定顺序来执行,正如它们希望执行的顺序一样,它们应该在相同的序列中被加到协议处理器。
  3. 协议拦截器必须实现为线程安全的。和Servlet相似,协议拦截器不应该使用实例变量,除非访问的那些变量是同步的。

这个示例给出了本地内容在连续的请求中怎么被用于持久一个处理状态的:

  1. DefaultHttpClient client = new DefaultHttpClient();
  2. HttpContext localContext = new BasicHttpContext();
  3. AtomicInteger count = new AtomicInteger(1);
  4. localContext.setAttribute("count", count);
  5. client.addRequestInterceptor(new HttpRequestInterceptor() {
  6. public void process(final HttpRequest request, final HttpContext context)
  7. throws HttpException, IOException {
  8. AtomicInteger count = (AtomicInteger) context.getAttribute("count");
  9. request.addHeader("Count", Integer.toString(count.getAndIncrement()));
  10. }
  11. });
  12. HttpGet httpget = new HttpGet("http://localhost/");
  13. for (int i = 0; i < 10; i++) {
  14. HttpResponse response = client.execute(httpget, localContext);
  15. HttpEntity entity = response.getEntity();
  16. if (entity != null) {
  17. EntityUtils.consume(entity);
  18. }
  19. }

转载链接:http://www.voidcn.com/article/p-wcdjywrl-nh.html

发表评论

表情:
评论列表 (有 0 条评论,318人围观)

还没有评论,来说两句吧...

相关阅读

    相关 HTTP请求

    http请求分为请求头和请求体,请求头的第一行又为请求行,下面分别进行介绍。 请求头 话不多说,我们直接以一个请求头为例子来介绍,我们随便抓取一个包进行演示,下列是我抓

    相关 http请求

    http 1、是客服端与服务器传输文本的一种协议 2、http协议是无状态的 3、http协议默认端口是80 4、http协议(加密传输)端口是443