Httpclient4.4之原理(请求执行)

apache Httpclient基于java BIO实现的,也是基于apache HttpCore项目。他最基本的功能是执行HTTP方法。HttpClient的API的主要入口就是HttpClient接口,看看这个示例:

package httpclienttest;

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class T1 {
    public static void main(String[] args) {
        HttpGet httpget = new HttpGet("http://www.baidu.com");
        try(CloseableHttpClient httpclient = HttpClients.createDefault();
                CloseableHttpResponse response = httpclient.execute(httpget);){
            System.out.printf("内容类型为:%s",response.getEntity().getContentType());
        }catch(Exception e){
            e.printStackTrace();
        }
}

1. HTTP请求

所有的http请求都由:方法名,请求url,HTTP协议组成。HttpClient支持HTTP/1.1支持的所有方法:GET,HEAD,POST,PUT,DELETE,TRACE和OPTIONS,HttpClient中都有一个特定的类与之对应:HttpGet,HttpHead,HttpPost,HttpPut,HttpDelete,HttpTrace和HttpOptions。

HTTP请求URI包括协议,主机名,可选的端口,资源路径,可选的查询条件等。如下例:

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

HttpClient提供了URIBuilder通用类来创建或修改请求URI,如例:

URI uri = new URIBuilder()
    .setScheme("http")
    .setHost("www.google.com")
    .setPath("/search")
    .setParameter("q", "httpclient")
    .setParameter("btnG", "Google Search")
    .setParameter("aq", "f")
    .setParameter("oq", "")
    .build();
HttpGet httpget = new HttpGet(uri);
System.out.println(httpget.getURI())

2. HTTP响应

HTTP响应是HTTP请求发送到服务端处理后响应到客户端的消息。响应第一行是协议与协议版本号,接着是数字状态码和一些文本信息,示例演示一下看看执行结果:

package httpclienttest;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.message.BasicHttpResponse;

public class T2 {
    public static void main(String[] args) {
        HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 
                HttpStatus.SC_OK, "OK");
        System.out.println(response.getProtocolVersion());
        System.out.println(response.getStatusLine().getStatusCode());
        System.out.println(response.getStatusLine().getReasonPhrase());
        System.out.println(response.getStatusLine().toString());
    }
}

输出为:

HTTP/1.1
200
OK
HTTP/1.1 200 OK

3. HTTP消息头

HTTP消息头(header)包含多个消息描述的信息,例如:内容长度,内容类型等。HttpClient提供的方法有检索,添加,删除和枚举等操作。 示例:

package httpclienttest;

import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.message.BasicHttpResponse;

public class T3 {
    public static void main(String[] args) {
        HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 
                HttpStatus.SC_OK, "OK");
        response.addHeader("Set-Cookie", "c1=a; path=/; domain=localhost");
        response.addHeader("Set-Cookie", "c2=b; path=\"/\", c3=c; domain=\"localhost\"");
        Header h1 = response.getFirstHeader("Set-Cookie");
        System.out.println(h1);
        Header h2 = response.getLastHeader("Set-Cookie");
        System.out.println(h2);
        Header[] hs = response.getHeaders("Set-Cookie");
        System.out.println(hs.length);
    }
}

输出:

Set-Cookie: c1=a; path=/; domain=localhost
Set-Cookie: c2=b; path="/", c3=c; domain="localhost"
2

更有效率的方法是通过HeaderIterator接口获得所有的header信息,示例:

package httpclienttest;

import org.apache.http.HeaderIterator;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.message.BasicHttpResponse;

public class T4 {
    public static void main(String[] args) {
        HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 
                HttpStatus.SC_OK, "OK");
        response.addHeader("Set-Cookie", "c1=a; path=/; domain=localhost");
        response.addHeader("Set-Cookie", "c2=b; path=\"/\", c3=c; domain=\"localhost\"");
        HeaderIterator it = response.headerIterator("Set-Cookie");
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

输出结果:

Set-Cookie: c1=a; path=/; domain=localhost
Set-Cookie: c2=b; path="/", c3=c; domain="localhost"

他也提供了更便利的方法来解析HTTP消息并获得header中一个个独立的header元素,示例:

package httpclienttest;

import org.apache.http.HeaderElement;
import org.apache.http.HeaderElementIterator;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.HttpVersion;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicHeaderElementIterator;
import org.apache.http.message.BasicHttpResponse;

public class T5 {
    public static void main(String[] args) {
        HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, 
                HttpStatus.SC_OK, "OK");
        response.addHeader("Set-Cookie", "c1=a; path=/; domain=localhost");
        response.addHeader("Set-Cookie", "c2=b; path=\"/\", c3=c; domain=\"localhost\"");
        HeaderElementIterator it = new BasicHeaderElementIterator(
                response.headerIterator("Set-Cookie"));
        while (it.hasNext()) {
            HeaderElement elem = it.nextElement(); 
            System.out.println(elem.getName() + " = " + elem.getValue());
            NameValuePair[] params = elem.getParameters();
            for (int i = 0; i < params.length; i++) {
                System.out.println(" " + params[i]);
            }
        }
    }
}

输出信息:

c1 = a
path=/
domain=localhost
c2 = b
path=/
c3 = c
domain=localhost
时间: 2024-11-09 13:49:36

Httpclient4.4之原理(请求执行)的相关文章

Httpclient4.4之原理(Http执行上下文)

最初HTTP被设计为无状态的.然而,真实的应用中常常要能够通过几个逻辑相关的请求/响应保持状态信息.为了使应用程序能够保持一个处理状态,HttpClient允许HTTP请求在特定的执行上下文内执行,称为HTTP上下文.如果相同的上下文在连续的请求之间重用,多个逻辑相关的连续请求可以参与一个逻辑会话.HTTP上下文的功能类似于java.util.Map<String,Object>,它只不过是任意命名的值的集合.应用程序能在请求执行之前填充上下文属性,也能在请求执行完成之后检查上下文. Http

Liberty nova-api HTTP请求执行流程

本博客欢迎转载,但请注明出处 http://blog.csdn.net/ringoshen/article/details/51387038 由于能力与时间有限,文章内容难免错漏,望大家多加指正,相互进步! 0. 前言 这次看了一下nova list命令的执行过程,整个过程可以分为几步:HTTP请求.URLMap分发.过滤.APIRouter到具体执行函数,接下来使用Postman组个包并发送http请求作为开始对各个模块进行跟踪和注解. 1. HTTP请求 OpenStack组件都是通过RES

关于多个Ajax请求执行返回先后的问题

注:转载请在显著地方标注来源 有时候在一个业务事件处理流程上,可能会遇到点击了一个按钮或者其他事件触发了一个动作 需要执行两个以上的Ajax请求,但是可能要顾虑到Ajax请求执行的先后顺序,有时候Ajax请求顺序出问题,会导致各种问题 例如现在有两个ajax事件,分别为ajax1 ,ajax2 一个叫做main的方法调用执行入口 1. function main(){ ajax1(data,callback); ajax2(data,callback); } 如果我们按照上面的方法去执行,表面上

HttpClient4.X发送Get请求的url参数拼接

HttpClient4.X发送Get请求的参数拼接 使用httpClient发送get请求时,请求参数可以以?key=val&key1=val1的拼接到url后面. 但是请求参数较多时,这种方法比较麻烦,也不太优雅:研究了一下发现HttpClient4.X本身 是支持处理参数的. 1. 使用 URIBuilder来构建请求URI httpclient相关的jar包mvn依赖: <dependency> <groupId>org.apache.httpcomponents&l

Jmeter -- 循环控制器 -- 控制请求执行次数

目的: 登录请求 -- 执行一次 查询请求 -- 执行多次 步骤: 1. 添加循环控制器,按照下图层级所示: 2. 配置线程并发数,和循环控制器循环次数 原文地址:https://www.cnblogs.com/xiaochongc/p/11557815.html

server,viewstate原理,请求过程原理,cookie

1:Request,Response其它成员  Response.Write(Request.Url.ToString());//获取当前请求的URL            Response.Write("<hr/>");            Response.Write(Request.UrlReferrer.ToString());//获取上传请求的URL信息                        盗链                        SEO:搜

基于RFS(robot framework selenium)框架模拟POST/GET请求执行自动化接口测试

转载自:http://www.cnblogs.com/jerry-yin/articles/4812012.html 今天研究了一下基于RFS自动化测试框架实现HTTP的POST/GET请求发送执行自动化测试的过程. 首先还是要先感谢万能的google(PS:因为在百度中完全无法找到相关信息),同时还要感谢github上面那些无私奉献的软件工程师们(PS:因为这里需要用到github上面原创作者的安装和使用过程). 好了,感谢完了,现在就是翻译了. 第一步:安装及配置RFS环境 略(详细求度娘吧

Struts2工作原理和执行流程图

在struts2的应用中,从用户请求到服务器返回相应响应给用户端的过程中,包含了许多组件如:Controller.ActionProxy.ActionMapping.Configuration Manager.ActionInvocation.Inerceptor.Action.Result等.下面根据 struts2.0体系架构图来解析这些组件之间的联系. 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 (客户端提交一个HttpServletRequest请求.) 请求被提交

想抛就抛:Application_Error中统一处理ajax请求执行中抛出的异常

女朋友不是想抛就抛,但异常却可以,不信请往下看. 今天在MVC Controller中写代码时,纠结了一下: public async Task<ActionResult> Save(int? postId) { if(!IsOwner(postId.Value, userId)) { //抛不抛异常呢? } } 在这个地方要不要抛异常呢? 如果不抛异常,就得这么写: public async Task<ActionResult> Save(int? postId) { if(!I