前言 这篇文章是这个系列的开篇,作为移动开发人员,开发的应用不免会对网络进行訪问。尽管如今已经有非常多的开源库帮助我们能够轻而易举的訪问网络,可是我们仍要去了解网络訪问的原理,这也是一个优秀开发人员所必备的知识点。这篇文章我们就先来了解一下HTTP协议原理。
1.HTTP简单介绍 HTTP是一个属于应用层的面向对象的协议,因为其简捷、高速的方式。适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展。得到不断地完好和扩展。
HTTP协议的主要特点 支持C/S(客户/server)模式。 简单高速:客户向server请求服务时,仅仅需传送请求方法和路径。请求方法经常使用的有GET、HEAD、POST。每种方法规定了客户与server联系的类型不同。因为HTTP协议简单,使得HTTPserver的程序规模小,因而通信速度非常快。 灵活:HTTP同意传输随意类型的数据对象。正在传输的类型由Content-Type加以标记。 无连接:无连接的含义是限制每次连接仅仅处理一个请求。server处理完客户的请求。并收到客户的应答后,即断开连接。採用这样的方式能够节省传输时间。 无状态:HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着假设兴许处理须要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。还有一方面,在server不须要先前信息时它的应答就较快。
1.http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址。port指定一个端口号,为空则使用默认端口80。abs_path指定请求资源的URI(Web上随意的可用资源)。 HTTP有两种报文各自是请求报文和响应报文。让我们先来看看请求报文。
2.HTTP的请求报文 先来看看请求报文的一般格式:
通常来说一个HTTP请求报文由请求行、请求报头、空行、和请求数据4个部分组成。
请求行 请求行由请求方法,URL字段和HTTP协议的版本号组成。格式例如以下:
1.Method Request-URI HTTP-Version CRLF
当中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本号;CRLF表示回车和换行(除了作为结尾的CRLF外,不同意出现单独的CR或LF字符)。 HTTP请求方法有8种。各自是GET、POST、DELETE、PUT、HEAD、TRACE、CONNECT 、OPTIONS。当中PUT、DELETE、POST、GET分别相应着增删改查。对于移动开发最经常使用的就是POST和GET了。
请求报头 在请求行之后会有0个或者多个请求报头,每一个请求报头都包括一个名字和一个值,它们之间用“:”切割。请求头部会以一个空行,发送回车符和换行符,通知server以下不会有请求头。关于请求报头,会在后面的消息报头一节做统一的解释。
请求数据 请求数据不在GET方法中使用。而是在POST方法中使用。 POST方法适用于须要客户填写表单的场合,与请求数据相关的最经常使用的请求头是Content-Type和Content-Length。
3.HTTP的响应报文 先来看看响应报文的一般格式:
HTTP的响应报文由状态行、消息报头、空行、响应正文组成。 响应报头后面会讲到,响应正文是server返回的资源的内容,先来看看状态行。
状态行 1、状态行格式例如以下:
1.HTTP-Version Status-Code Reason-Phrase CRLF
当中,HTTP-Version表示serverHTTP协议的版本号。Status-Code表示server发回的响应状态代码。Reason-Phrase表示状态代码的文本描写叙述。 状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
比如訪问我的CSDN博客地址响应的状态行是:
1.HTTP/1.1 200 OK
4.HTTP的消息报头 消息报头分为通用报头、请求报头、响应报头、实体报头等。消息头由键值对组成,每行一对。关键字和值用英文冒号“:”分隔。
通用报头 既能够出如今请求报头,也能够出如今响应报头中
点击红色画笔的区域就能够看到请求报文和响应报文了 请求报文:
1. //请求行
2.Host: blog.csdn.net //请求报头Connection: keep-alive
3.Cache-Control: max-age=0
4.Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
5.Upgrade-Insecure-Requests: 1
6.User-Agent: Mozilla/5.0 (Windows NT 6.1; 7.WOW64) AppleWebKit/537.36 (KHTML, like 8.Gecko) Chrome/47.0.2526.80 Safari/537.36 9.QQBrowser/9.3.6872.400
10.Accept-Encoding: gzip, deflate, sdch
11.Accept-Language: zh-CN,zh;q=0.8
Cookie: bdshare_firstime=1443768140949; uuid_tt_dd=5028529250430960147_20151002;
...省略
非常easy看出訪问的是我的博客地址javascript:void(0),请求的方法是GET,因为是GET方法所以并没有请求数据。
响应报文:
HTTP/1.1 200 OK //状态行
Server: openresty //响应报头
Date: Sun, 27 Mar 2016 08:26:54 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=20
Vary: Accept-Encoding
Cache-Control: private
X-Powered-By: PHP 5.4.28
Content-Encoding: gzip
//不能省略的空格
28b5
}ysI 1ߡFsgl n- ]{^_ { 'z! C , m# 0 !l ` 4x ly .ݪ*
ڴzAt_Xl * 9'O ɬ ' ק 3 ^1a
...省略
响应报文没什么可说的,接下来我们配置好手机网络代理,訪问一个应用的界面
请求报文:
//请求行
Content-Length: 226 //请求报头
Content-Type: application/x-www-form-urlencoded
Host: patientapi.shoujikanbing.com
Connection: Keep-Alive
User-Agent: Mozilla/5.0 (Linux; U; Android 4.4.4; zh-cn; MI NOTE LTE Build/KTU84P) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1
Accept-Encoding: gzip
//不能省略的空格,以下是请求数据
clientversion=2_2.0.0&time=1459069342&appId=android&channel=hjwang&sessionId=0d1cee1f31926ffa8894c64804efa855101d56eb21caf5db5dcb9a4955b7fbc9&token=b191944d680145b5ed97f2f4ccf03058&deviceId=869436020220717&type=2&version=2.0.0
从请求报文的请求行来看,请求的方法是POST,请求地址为http://patientapi.shoujikanbing.com/api/common/getVersion。非常显然是获取版本号信息的接口。
响应报文:
HTTP/1.1 200 OK //状态行
Server: nginx //响应报头
Date: Sun, 27 Mar 2016 09:02:20 GMT
Content-Type: text/html;charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: sessionId=0d1cee1f31926ffa8894c64804efa855101d56eb21caf5db5dcb9a4955b7fbc9; expires=Mon, 28-Mar-2016 09:02:20 GMT; Max-Age=86400; path=/; domain=.shoujikanbing.com
Set-Cookie: PHPSESSID=0d1cee1f31926ffa8894c64804efa855101d56eb21caf5db5dcb9a4955b7fbc9; path=/; domain=.shoujikanbing.com
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Encoding: gzip
//不能省略的空格
17f //实体报文编码格式为gzip所以显示在这里的响应数据是乱码
mP N @ "E ?
响应报文的实体採用的编码格式为为gzip,所以在Fiddler软件中显示的是乱码。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。