乐趣区

关于android:Android网络编程一HTTP协议原理

前言
这篇文章是这个系列的开篇,作为挪动开发人员,开发的利用未免会对网络进行訪问。只管现在曾经有十分多的开源库帮忙咱们可能轻而易举的訪问网络,可是咱们仍要去理解网络訪问的原理,这也是一个优良开发人员所必备的知识点。这篇文章咱们就先来理解一下 HTTP 协定原理。

1.HTTP 简略介绍
HTTP 是一个属于应用层的面向对象的协定,因为其简捷、高速的形式。实用于分布式超媒体信息系统。它于 1990 年提出,通过几年的应用与倒退。失去一直地完整和扩大。

HTTP 协定的次要特点
反对 C /S(客户 /server)模式。
简略高速:客户向 server 申请服务时,仅仅需传送申请办法和门路。申请办法常常应用的有 GET、HEAD、POST。每种办法规定了客户与 server 分割的类型不同。因为 HTTP 协定简略,使得 HTTPserver 的程序规模小,因此通信速度十分快。
灵便:HTTP 批准传输随便类型的数据对象。正在传输的类型由 Content-Type 加以标记。
无连贯:无连贯的含意是限度每次连贯仅仅解决一个申请。server 解决完客户的申请。并收到客户的应答后,即断开连接。採用这样的形式可能节俭传输工夫。
无状态:HTTP 协定是无状态协定,无状态是指协定对于事务处理没有记忆能力。短少状态意味着假如兴许解决须要后面的信息,则它必须重传,这样可能导致每次连贯传送的数据量增大。还有一方面,在 server 不须要先前信息时它的应答就较快。
HTTP URL 的格局例如以下

http://host”:”port

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 了。

  • GET:申请获取 Request-URI 所标识的资源
  • POST:在 Request-URI 所标识的资源后附加新的数据
  • HEAD:申请获取由 Request-URI 所标识的资源的响应消息报头
  • PUT:申请 server 存储一个资源。并用 Request-URI 作为其标识
  • DELETE:申请 server 删除 Request-URI 所标识的资源
  • TRACE:申请 server 回送收到的申请信息。次要用于測试或诊断
  • CONNECT:HTTP/1.1 协定中预留给可能将连贯改为管道形式的代理 server。
  • OPTIONS:申请查问 server 的性能。或者查问与资源相干的选项和需要

  • 比方我去訪问我的 CSDN 博客地址申请行是:
  1. GET javascript:void(0) HTTP/1.1

申请报头
在申请行之后会有 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 示意状态代码的文本刻画叙述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

  • 100~199:批示信息,示意申请已接管,持续解决
  • 200~299:申请胜利。示意申请已被胜利接管、了解、承受
  • 300~399:重定向,要结束申请必须进行更进一步的操作
  • 400~499:client 谬误。申请有语法错误或申请无奈实现
  • 500~599:server 端谬误,server 未能实现非法的申请
    常见的状态码例如以下:
  • 200 OK:client 申请胜利
  • 400 Bad Request:client 申请有语法错误,不能被 server 所了解
  • 401 Unauthorized:申请未经受权,这个状态代码必须和 WWW– – – Authenticate 报头域一起应用
  • 403 Forbidden:server 收到申请。可是回绝提供服务
  • 500 Internal Server Error:server 产生不可预期的谬误
  • 503 Server Unavailable:server 以后不能解决 client 的申请。一段时间后可能恢复正常
  • 比方訪问我的 CSDN 博客地址响应的状态行是:

    1.HTTP/1.1 200 OK

4.HTTP 的消息报头
消息报头分为通用报头、申请报头、响应报头、实体报头等。音讯头由键值对组成,每行一对。关键字和值用英文冒号“:”分隔。

通用报头
既可能出现在申请报头,也可能出现在响应报头中

  • Date:示意音讯产生的日期和工夫
  • Connection:批准发送指定连贯的选项。比方指定连贯是间断的。或者指定“close”选项,告诉 server,在响应结束后,敞开连贯
  • Cache-Control:用于指定缓存指令,缓存指令是单向的(响应中呈现的缓存指令在申请中未必会呈现)。且是独立的(一个音讯的缓存指令不会影响还有一个音讯解决的缓存机制)

  • 申请报头
    申请报头告诉 server 对于 client 求求的信息,典型的申请头有:
  • Host:申请的主机名,批准多个域名同处一个 IP 地址,即虚拟主机
  • User-Agent:发送申请的浏览器类型、操作系统等信息
  • Accept:client 可辨认的内容类型列表,用于指定 client 接管那些类型的信息
  • Accept-Encoding:client 可辨认的数据编码
  • Accept-Language:示意浏览器所反对的语言类型
  • Connection:批准 client 和 server 指定与申请 / 响应连贯无关的选项,比方这是为 Keep-Alive 则示意放弃连贯。
  • Transfer-Encoding:告知接收端为了保障报文的牢靠传输。对报文採用了什么编码方式。

  • 响应报头
    用于 server 传递本身信息的响应,常见的响应报头:
  • Location:用于重定向接受者到一个新的地位,常常应用在更换域名的时候
  • Server:包含可 server 用来解决申请的零碎信息。与 User-Agent 申请报头是相相应的

  • 实体报头
    实体报头用来定于被传送资源的信息,既可能用于申请也可用于响应。申请和响应音讯都可能传送一个实体。常见的实体报头为:
  • Content-Type:发送给接收者的实体注释的媒体类型
  • Content-Lenght:实体注释的长度
  • Content-Language:刻画叙述资源所用的自然语言,没有设置则该选项则感觉实体内容将提供给全副的语言浏览
  • Content-Encoding:实体报头被用作媒体类型的修饰符。它的值批示了曾经被利用到实体注释的附加内容的编码,因此要取得 Content-Type 报头域中所援用的媒体类型,必须採用相应的解码机制。
  • Last-Modified:实体报头用于批示资源的最初改变日期和工夫
    Expires:实体报头给出响应过期的日期和工夫

  • 5. 利用举例
    要想查看网页或者手机申请网络的申请报文和响应报文有十分多种办法,在这里就不赘述了。
    关上 Fiddler,而后用浏览器訪问我的 CSDN 博客站点:

点击红色画笔的区域就可能看到申请报文和响应报文了
申请报文:

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.shoujikanbi…。十分显然是获取版本号信息的接口。

响应报文:

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 软件中显示的是乱码。

退出移动版