HTTP网络请求基本介绍
HTTP是一种应用层协议,它通过TCP实现了可靠的数据传输,能够保证该数据的完整性,正确性,而TCP对于数据传输控制的优点也能够体现在HTTP上,使得HTTP的数据传输吞吐量,效率得到保证.
对于移动开发来说,网络应用基本上都是C/S构架,也就是客户端/服务器构架.客户端通过向服务器发起特定的请求,服务器返回结果,客户端解析结果,再将结果展示在UI上.客户端与服务器的交互如下图所示.
Created with Raphaël 2.1.0 Client客户端 Client客户端 Web服务端 Web服务端 包含命令和URI的请求报文 GET articles/123.html HTTP/1.1 Host: www.devtf.cn 包含结果的响应报文 HTTP/1.1 200 OK Content-Type: text/plain 返回的结果
详细的交互流程有如下几步:
1. 客户端执行网络请求,从URL中解析出服务器的主机名
2. 将服务器的主机名转换成服务器的IP地址
3. 将端口号从URL中解析出来
4. 建立一条客户端与Web服务器的TCP连接
5. 客户端通过输出流向服务器发送一条HTTP请求
6. 服务器向客户端会送一条HTTP响应报文
7. 客户端从输入流获取报文
8. 客户端解析报文,关闭连接
9. 客户端将结果显示在UI上
Http的请求方式
HTTP协议提供了集中请求方式,每种请求方式都有不同的作用.被大家所熟知的请求方式有如下7种GET,POST,DELETE,PUT,HEAD,TRACE,OPTIONS.其中PUT,DELETE,POST,GET分别对应了资源的增删查改4个功能,也是客户端中运用最多的4个请求.下面我们分别来看看这几个请求的作用.
GET请求
GET是最常用的方法,它的作用是获取服务器中的某个资源.下图显示了一个例子,在这个例子中,客户端用GET方法发起了一次HTTP请求,然后服务端将对应的资源返回给客户端.
Created with Raphaël 2.1.0 Client客户端 Client客户端 Web服务端 Web服务端 请求报文 GET articles/123.html HTTP/1.1 Host: www.devtf.cn Accept: " 包含网页的响应报文 HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1024 网页数据
上图中客户端请求的资源是www.devtf.cn/articles路径下的123.html,服务端将123.html返回给客户端.需要注意的是,GET请求的参数都需要放到请求的URL中,第一个参数之前有一个”?”,参数的格式为: 参数名=参数值,参数之间通过”&”连接. 例如,我们在请求 www.devtf.cn/articles/123.html 时希望传递用户名和用户id两个参数,那么格式应该是这样的: www.devtf.cn/articles/123.html?username=myname&userid=123 .
POST请求
POST方法起初是用来向服务器传递数据的. 实际上,POST请求通常会用来提交HTML的表单. 表单中填好的数据会被传输给服务器,然后由服务器对这些数据进行处理. 下图显示了一个用POST请求的执行流程.
Created with Raphaël 2.1.0 Client客户端 Client客户端 Web服务端 Web服务端 提交表单,请求报文 POST login.php HTTP/1.1 Host: www.devtf.cn Content-Type: text/plain Content-Length: 30 username=mrsimple & pwd=hello 123 包含结果的响应报文 HTTP/1.1 200 OK Content-Type: text/plain Content-Length: 21 success
PUT请求
与GET从服务器读取资源相反,PUT方法会向服务器写入资源. 有些发布系统允许用户创建Web页面,并用PUT直接向其传输到Web服务器中,如下图所示
Created with Raphaël 2.1.0 Client客户端 Client客户端 Web服务端 Web服务端 请求报文 PUT new-art.txt HTTP/1.1 Host: www.devtf.cn Content-Type: text/html Content-Length: 128 This is file content 包含结果的响应报文 HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1024 location: http://www.devtl.cn/new-art.txt http://www.devtf.cn/new-art.txt
PUT方法的语义就是让服务器用请求的主体部分来创建一个由所请求的URL命名的新文档,如果那个URL已经存在的话,就用这个资源来替代它. 例如, 在上图的请求中会在www.devtf.cn的网站根目录下创建一个new-art.txt的文件,文件内容为”This is file content” .
DELETE请求
顾名思义,DELETE方法所做的事情就是请服务器删除请求URL所指定的资源. 但是,客户端应用程序无法保证删除操作一定会被执行. 因为,HTTP规范允许服务器在不通知客户端的情况下撤销请求. 下图显示了一个DELETE方法实例.
Created with Raphaël 2.1.0 Client客户端 Client客户端 Web服务端 Web服务端 请求报文 DELETE articies/12.html HTTP/1.1 Host: www.devtf.cn 包含结果的响应报文 HTTP/1.1 200 OK Content-Type: text/plain Content-Length: 20 success
DELETE方式与GET请求一样,参数都需要放在请求的URL中.
HEAD请求
HEAD方法与GET方法的行为很类似,但服务器在响应中只返回首部. 不会返回实体的主体部分. 这就允许客户端在未获取实际资源的情况下,对资源的首部进行检查. 使用HEAD可以在不获取资源的情况下了解资源的情况(比如,判断其类型); 通过查看响应中的状态码,看看某个对象是否存在; 通过查看首部,测试资源是否被修改了. 服务器开发者必须确保返回的首部与GET请求所返回的首部完全相同. 遵循HTTP/1.1规范,就必须实现HEAD方法. 如下图所示.
Created with Raphaël 2.1.0 Client客户端 Client客户端 Web服务端 Web服务端 请求报文 HEAD articies/123.html HTTP/1.1 Host: www.devtf.cn Accept: " 包含网页HEADER信息的响应报文 HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1024
TRACE请求
客户端发起一个请求时,这个请求可能要穿过防火墙,代理,网关或其他一些应用程序. 每个中间节点都可能会修改原始的HTTP请求. TRACE方法允许客户端在最终将请求发送给服务器时,看看他变成了什么样子.
TRACE请求会在目的服务器端发起一个”环回”诊断. 行程最后一站的服务器会弹回一条TRACE响应,并在响应主体中携带它收到的原始请求报文. 这样客户端就可以查看在所有中间HTTP应用程序组成的请求/响应链上,原始报文是否以及如何被毁坏或修改过,如下图所示.
Created with Raphaël 2.1.0 Client客户端 Client客户端 代理 代理 Web服务端 Web服务端 提交表单,请求报文 TRACE index.html HTTP/1.1 Host: www.devtf.cn Accept: " TRACE index.html HTTP/1.1 Host: www.devtf.cn Accept: " Via: 1.1 proxy..com 包含结果的响应报文,报文返回给代理在返回到最终用户客户端 HTTP/1.1 200 OK Content-Type: text/plain Content-Length: 21 TRACE index.html HTTP/1.1 Host: www.devtf.cn Accept: " Via: 1.1 proxy..com HTTP/1.1 200 OK Content-Type: text/plain Content-Length: 21 Via: 1.1 proxy..com TRACE index.html HTTP/1.1 Host: www.devtf.cn Accept: " Via: 1.1 proxy..com
TRACE方法主要用于诊断,也就是说,用于验证请求是否如愿穿过了请求/响应链. 它也是一种很好的工具,可以用来查看代理和其他应用程序对用户请求所产生效果.
OPTIONS请求
OPTIONS方法请求Web服务器告知其支持的各种功能. 可以询问服务器通常支持哪些方法,或者对某些特殊资源支持哪些方法(有些服务器可能只支持对一些特殊类型的对象使用特定的操作). 这对客户端应用程序提供了一种手段,使其不用实际访问那些资源就能判定访问各种资源的最优方式. 下图显示了一个使用OPTIONS方法的请求.
Created with Raphaël 2.1.0 Client客户端 Client客户端 Web服务端 Web服务端 请求报文 OPTIONS" HTTP/1.1 Host: www.devtf.cn Accept: " 包含结果的响应报文 HTTP/1.1 200 OK Allow: GET.POST.PUT.OPTIONS Content-Length: 0