(一)HTTP协议与HttpClient入门程序

     HTTP协议是基于B/S架构进行通信的,而HTTP协议的服务器端实现程序有httpd、nginx等,其客户端的实现程序主要是Web浏览器,例如Firefox、InternetExplorer、Google chrome、Safari、Opera等。作为Apache的一个开源项目HttpClient,它实现了Http标准中Client(客户)端的所有功能,使用它可以很容易地进行HTTP信息的传输。那么如何理解HTTP标准呢?以下将进行详细的介绍,并使用HttpClient实现客户端向服务器端发起请求、判断状态码和接收响应体的整个过程。

1 HTTP-超文本传输协议

    HTTP协议是Hyper Text Transfer Protocol-超文本传输协议的缩写,它基于TCP/IP通信协议来传递数据(HTML文件、图片文件、查询结果等),同时,它也指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。如图1-1所示为HTTP协议通信流程图。

图1-1 HTTP通信协议流程图

1.1 HTTP简介

        HTTP是一个应用协议层(该层常见的协议包括:DNS、HTTP、SMPT与POP3/IMAP等,可直接为应用程序提供网络服务),由请求部分和响应部分构成,是一个标准的客户端-服务器模型。可理解为:浏览器作为本地客户端,通过URLUniform Resource Location,统一资源定位符,有别于URI-Uniform Resource Identifier,统一资源标识符。详见https://www.jianshu.com/p/ba15d066f777)向HTTP服务器端(Web服务器)发送请求,web服务器根据接收到的请求信息,在完成处理后,向客户端发送响应消息。

1.2 HTTP协议特点

        HTTP协议特点如下,

    (1)支持客户端-服务器模型(1.1中已经对其做过解释);

    (2)简单快速。即:客户端在向服务器端发送请求时,需要发送请求方法(常见的请求方法有8种,每一种请求方法规定了客户端和服务器端之间不同的联系类型。详见https://www.jianshu.com/p/172149ff9189)和资源路径(URL,统一资源定位符,可用于在服务器端定位到所需要的文件资源路径)。

    (3)资源传输类型灵活。HTTP协议允许传输任意类型的数据对象,正在传输的对象类型由Content-Type加以标记。常见的Content-Type取值如下。

图1.2-1 常见的Content-Type取值

    (4)无连接。网络编程中最基本的概念就是面向连接(connection-oriented)和无连接(connectionless)协议。通俗的讲,在Java网络编程中常提到的TCP和UDP协议就分别属于面向连接协议和无连接协议。其中,TCP协议中的“三次握手,四次挥手”提供了一种数据校验机制,可以确保数据传输的可靠性;而UDP以数据报的形式发送数据,网络会尽最大努力传送每一个数据报,但并不保证数据报不丢失、不延迟或者不错序传输。

        HTTP采用无连接协议。即:每次连接只处理一个请求。服务器处理完客户端的请求,然后将结果响应给客户端,在收到客户端的应答之后,就断开连接。这种方式可以节省传输时间。

    (5)无状态。HTTP协议就是无状态协议,其缺点是:如果在后续的处理过程中需要用到之前的信息,则必须要重新传送,会导致每次链接传输的数据量增大;但是相对的,如果后续的连接不需要之前提供的信息,响应就会比较快。但是为了为了解决HTTP的无状态特性,Cookie和Session技术得以出现(有关这两者的详细信息,可参见https://www.jianshu.com/p/2f7031a69f43https://www.jianshu.com/p/9a561b36e9f3)。

1.3 HTTP消息结构

    HTTP协议是一种无状态的请求/响应协议, 在该协议中,①一个HTTP"客户端"是一个应用程序(Web浏览器或其他任何客户端),通过连接到服务器达到向服务器发送一个或多个HTTP的请求的目的。②一个HTTP"服务器"同样也是一个应用程序(通常是一个Web服务,如Apache Web服务器或IIS服务器等),通过接收客户端的请求并向客户端发送HTTP响应数据。

    HTTP协议使用统一资源定位符(Uniform Resource Location,URL)来传输数据和建立连接,一旦建立连接后,数据消息就通过类似Internet邮件所使用的格式[RFC5322]和多用途Internet邮件扩展(MIME)[RFC2045]来传送。

1.3.1 客户端请求消息

    客户端发送一个HTTP请求到服务器端的请求消息包括以下格式:请求行(request line)、请求头部(request header)、空行和请求数据4个部分组成。如下图1.3.1-1所示。

图1.3.1-1 客户端消息格式

    这种客户端发送的请求头信息可以在浏览器中通过调试工具看到。如图1.3.1-2所示,

图1.3.1-2 请求头信息

1.3.2 服务端响应信息

     服务器端的HTTP响应也有4个部分组成,分别是:状态行、消息报头、空行和相应正文。如下图1.3.2-1所示,

图1.3.2-1 服务端响格式

    也可以在Google Chrome的调试工具中去查看响应头的内容,

图1.3.2-2 响应头的信息

1.3.3 响应头信息详解

    类似于图1.3.2-2,下图1.3.3-1为响应头内的信息。

图1.3.3-1 Response-Headers信息

    其具体含义如下图所示,

图1.3.3-2 Response-Headers信息详解-来自[菜鸟教程]

1.3.4 HTTP状态码(HTTP Status Code)

    当通过浏览器访问一个网页页面时,浏览器会向网页所在的服务器发送请求;而在浏览器接收并显示网页前,该网页所在的服务器会预先返回一个包含HTTP状态码的信息头(Server Header),用以响应浏览器的请求。这个状态码可以用于判断客户端的此次请求是否成功,例如,

图1.3.4-1 常见的状态码值

    HTTP状态码由3个十进制数字组成,第一个数字定义了状态码的类型,后两个数字没有具体的分类含义。因此,可根据第1个数字对HTTP状态码进行分类,如下图所示,

图1.3.4-2 HTTP状态码分类-来自[菜鸟教程]

       具体的状态码值信息,可参见https://www.runoob.com/http/http-status-codes.html

1.3.5 HTTP Content-Type

    Content-Type(内容类型),网页中存在的Content-Type可以在浏览器的调试工具中看到,如下图所示,

图1.3.5-1 Content-Type举例

    该Content-Type会告诉客户端从服务器端发送回来的响应内容,它可用于定义网络文件的类型和网页的编码,决定了浏览器将以什么形式、什么编码区读取这个文件。其语法格式为:

图1.3.6-2 Content-Type语法格式

    其中:①text/html表示媒体类型为HTML格式;②charset=utf-8:告诉浏览器需要以UTF-8编码格式去读取该媒体文件;③multipart/form-data:需要在表单中进行文件上传时,用到该格式。常见的媒体类型在1.2中已经列举过。

2 使用HttpClient

2.1 使用HttpClient发起Http请求的步骤

    通过上述内容,了解到了HTTP协议支持的客户端-服务器模型,从这个角度出发来理解“Http Client实现了Http标准中Client(客户)端所有功能”,很容易理解,这里所说的“客户端功能”主要是指:作为客户端的浏览器,按照一定请求方式,向服务器发送请求,并根据状态码判断是否请求成功,进而获取到服务器返回的响应体信息的功能

    而Http Client最关键的方法是:执行Http请求的方法execute,只要将HTTP请求传入,就可以得到HTTP响应。这个步骤可以总结为:

    (1)创建一个Http Client对象(可理解对创建一个虚拟的浏览器客户端对象);

    (2)创建一个Request对象,用于封装(客户端将要发起的)请求;

    (3)使用Http Client来执行Request请求,得到服务端返回的响应-response实例;

    (4)通过response实例获取服务器返回的状态码,判断是否请求成功;

    (5)若请求成功,可通过response获取响应体,并对其进行解析;

    (6)关闭Http Client。

2.2 HttpClient使用-入门程序

    下面,就使用HTTP Client来模拟这个客户端向浏览器发送请求,并接受相应信息的过程。

图2.2-1 入门程序代码
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容