Android网络编程(一) HTTP协议

前言
作为移动开发者,开发的应用不免会对网络进行访问,虽然现在已经有很多的开源库帮助我们可以轻而易举的访问网络,但是我们仍要去了解网络访问的原理。经常使用各种开源库,导致很多基础知识都记忆不是很牢固。做个笔记来加强自己的记忆。(参考大神博客 https://blog.csdn.net/itachi85/article/details/50982995
HTTP协议的主要特点
1.支持C/S(客户端/服务器)模式
2.简单快速:客户端向服务器请求时,只需要传送请求方法和路径。请求方法有8种:GET、POST、HEAD、PUT、DELETE、TRACE、CONNECT、OPTIONS(移动端常用的有GET、POST、HEAD、PUT),每种方法规定了客户端与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象(如text/html、text/plain、application/xml、application/json等 )。正在传输的类型由报头的Content-Type字段加以标记。
4.无连接:无连接是指服务器限制每次连接只处理一个请求。服务器处理完客户端的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP URL 的格式如下

http://host[":"port][abs_path]

“http”表示请求的协议是http;”host”表示合法的Internet主机域名或者IP地址;”port”指定一个发生请求的端口号,为空则使用默认的端口号80端口;”abs_path”指定请求资源的URL

HTTP报文格式
1.请求报文

请求报文的一般格式
通常来说,一个请求报文由请求行1、请求报头2、空行3和请求数据4这4个部分组成。
请求行:由请求方法,URL字段和HTTP协议的版本组成

Method Request-URI HTTP-Version CRLF

其中 Method表示请求方法如GET、POST、HEAD等;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

请求报头:在请求行之后会有0个或者多个请求报头,每个请求报头都包含一个名字和一个值(key:value),它们之间用“:”分割。请求头部会以一个空行,发送回车符和换行符,通知服务器以下不会有请求头。关于请求报头,会在后面的消息报头一节做统一的解释。

请求数据:请求数据不在GET方法中使用,而是在POST方法中使用。POST方法适用于需要客户填写表单的场合,与请求数据相关的最常用的请求头是Content-Type和Content-Length。

请求报文范例

GET(Method) http://blog.csdn.net/itachi85(Request-URI) HTTP/1.1(HTTP-Version)  //请求行                           
Host: blog.csdn.net                                                       //请求报头
Connection: keep-alive
Cache-Control: max-age=0       
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36 QQBrowser/9.3.6872.400
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Cookie: bdshare_firstime=1443768140949; uuid_tt_dd=5028529250430960147_20151002;
 //不能省略的空行
...//请求数据

2.响应报文
响应报文的一般格式
HTTP的响应报文由状态行1、消息报头2、空行3、响应正文4组成。
状态行:

HTTP-Version Status-Code Reason-Phrase CRLF

“HTTP-Version”表示服务器HTTP协议的版本;”Status-Code”表示服务器发回的响应状态代码;”Reason-Phrase”表示状态代码的文本描述。

状态码有三位数组成,第一个数字定义了响应的类别,且有五种可能的值:
1. 100~199:指示信息,表示请求已接收,继续处理
2. 200~299:请求成功,表示请求已被成功接收、理解、接受
3. 300~399:重定向,要完成请求必须进行更进一步的操作
4. 400~499:客户端错误,请求有语法错误或请求无法实现
5. 500~599:服务器端错误,服务器未能实现合法的请求
常见的状态码如下:
1. 200 OK:客户端请求成功
2. 400 Bad Request:客户端请求有语法错误,不能被服务器所理解
3. 401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
4. 403 Forbidden:服务器收到请求,但是拒绝提供服务
5. 500 Internal Server Error:服务器发生不可预期的错误

响应报文范例

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 ?    n m   1  
w ( HL (1^ P nK  E ѷ93'3gNLH  7P  $c \  T 4a6   L:+ 1dY%$g   h H   +

...省略

消息报头

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

1.通用报头
通用报头既可以出现在请求报头,也可以出现在响应报头中
Date:表示消息产生的日期和时间
Connection:允许发送指定连接的选项,例如指定连接是连续的,或者指定“close”选项,通知服务器,在响应完成后,关闭连接
Cache-Control:用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)

2.请求报头
请求报头通知服务器关于客户端求求的信息,典型的请求头有:
Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
User-Agent:发送请求的浏览器类型、操作系统等信息
Accept:客户端可识别的内容类型列表,用于指定客户端接收那些类型的信息
Accept-Encoding:客户端可识别的数据编码
Accept-Language:表示浏览器所支持的语言类型
Connection:允许客户端和服务器指定与请求/响应连接有关的选项,例如这是为Keep-Alive则表示保持连接。
Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。

3.响应报头
响应报头用于服务器传递自身信息的响应,常见的响应报头有:
Location:用于重定向接受者到一个新的位置,常用在更换域名的时候
Server:包含可服务器用来处理请求的系统信息,与User-Agent请求报头是相对应的

4.实体报头
实体报头用来定于被传送资源的信息,既可以用于请求也可用于响应。请求和响应消息都可以传送一个实体,常见的实体报头有:
Content-Type:发送给接收者的实体正文的媒体类型
Content-Lenght:实体正文的长度
Content-Language:描述资源所用的自然语言,没有设置则该选项则认为实体内容将提供给所有的语言阅读
Content-Encoding:实体报头被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。
Last-Modified:实体报头用于指示资源的最后修改日期和时间
Expires:实体报头给出响应过期的日期和时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值