Android 网络编程(一)HTTP协议

在Android开发中,经常会用到网络编程相关的知识,虽然也是用,但是感觉还是不太全面。所以整理下网络编程的相关知识。


HTTP简介

HTTP(HyperText Transport Protocol)协议是互联网上应用最为广发的一种网络协议标准,所有的www文件都必须遵守这个标准。
HTTP是一个适用于分布式超媒体信息系统的应用层协议。它于1990年提出,并得到不断地完善和扩展。

HTTP协议的主要特点:

  1. 支持C/S(客户/服务器)模式。
  1. 简单快速.客户向服务器请求服务时,只需传送请求方法路径。请求方法常用的有GET、POST、HEAD,每种方法规定了客户与服务器联系的类型不同。因为HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  2. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  3. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  4. 无状态:HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

HTTP URL 的格式如下

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

http表示要通过HTTP协议来定位网络资源;
host表示合法的Internet主机域名或者IP地址;
port指定一个端口号,为空则使用默认端口80;abs_path指定请求资源的URI(Uniform Resource Identifier,纸Web上任意的可用资源)。

HTTP有两类报文:请求报文和响应报文。


HTTP请求报文

一个HTTP请求报文由请求行、消息报头、空行和请求数据4个部分组成。请求报文的一般格式如下所示:


HTTP请求报文

(1)请求行

请求行由请求方法字段、URI字段和HTTP协议的版本字段组成,它们之间用空格分开,格式如下:

Method Request-URI HTTP-Version CRLF
例如:GET /from.html HTTP/1.1 (CRLF)

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

请求方法 含义
GET 请求获取Request-URI所标识的资源
POST 在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应消息报头
PUT 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

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 请求服务器存储一个资源,并用Request-URI作为其标识
DELETE 请求服务器删除Request-URI所标识的资源
TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

(2)消息报头
这部分稍后再详细说。

(3)空行

最后一个请求头之后是一个空行,发送回车符和换行符,通知服务器以下不再有请求头。

(4)请求数据

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

在接收数据和解释请求消息后,服务器会返回一个HTTP响应消息。


HTTP响应报文

HTTP响应报文也是由4个部分组成的,分别是:状态行、消息报头、空行、响应正文。如下图所示:


HTTP响应报文

(1)状态行

状态行的格式如下:

HTTP-Version Status-Code Reason-Phrase CRLF
例如:HTTP/1.1 200 OK (CRLF)

其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

  • 100~199:指示信息,表示请求已接收,继续处理
  • 200~299:请求成功,表示请求已被成功接收、理解、接受
  • 300~399:重定向,要完成请求必须进行更进一步的操作
  • 400~499:客户端错误,请求有语法错误或请求无法实现
  • 500~599:服务器端错误,服务器未能实现合法的请求
状态代码 状态描述
200 OK 客户端请求成功
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 请求资源不存在,比如输入了错误的URL
500 Internal Server Error 服务器发生不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

状态代码具体种类很多,这里列出常见的状态吗。

状态代码 状态描述
200 OK 客户端请求成功
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not Found 请求资源不存在,比如输入了错误的URL
500 Internal Server Error 服务器发生不可预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常

(2)消息报头

在下面介绍。

(3)空行

这行是空行。

(4)响应正文

响应正文就是服务器返回的资源的内容。


HTTP消息报头

HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,状态就是请求行;对于响应消息,开始行就是状态行)、消息报头(可选)、空行(只有CTRF的行)、消息正文(可选)4部分组成。

消息报头分为普通报头、请求报头、响应报头、实体报头等。消息头由键值对(头部字段名/值)组成,每行一对,关键字和值用英文冒号“:”分隔。形式如下:

头部字段名 +":"+空格 + 值

消息报头头部字段名是大小写无关的。

(1)普通报头
即可以用于请求,也可用于响应,不用于被传输的实体,只用于传输消息,是作为一个整体而不是特定资源与事务相关联。例如:

  • Date:表示消息产生的日期和时间
  • Connection:允许发送指定连接的选项,例如指定连接是连续的,或者指定“close”选项,通知服务器,在响应完成后,关闭连接。

(2)请求报头
允许客户端传递关于自身的信息和希望的响应形式。请求报头通知服务器有关客户端请求的信息,典型的请求报头如下几种。

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

(3)响应报头
用于服务器传递自身信息的响应,常见的响应报头:

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

(4)实体报头
定于被传送资源的信息。既可以用于请求,也可用于响应。请求和响应消息都可以传送一个实体,常见的实体报头为:

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

HTTP报文示例

get请求

访问我的博客 http://blog.csdn.net/VNanyesheshou
请求报文

GET http://blog.csdn.net/vnanyesheshou HTTP/1.1   //请求行
Host: blog.csdn.net                 //请求报头
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Cookie: uuid_tt_dd=-1205275839430178051_20170417; bdshare_firstime=1492437984444; UM_distinctid=15d02126ec433b-05cbdcfaa61095-333f5902-100200-15d02126ec5805; UN=VNanyesheshou; UE=""; BT=1498978406572; __message_sys_msg_id=0; __message_gu_msg_id=0; __message_cnel_msg_id=0; uuid=776d64a5-fe9f-4005-912c-aa9cc5d4283a; TY_SESSION_ID=a7afad62-bcc6-4390-8e04-7bfefe0addfd; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1498978348,1501397302; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1501398302; CNZZDATA1262013314=1683604614-1498975340-%7C1501396556; dc_tos=otw6ce; dc_session_id=1501398302320
        //空行

get请求没有请求数据,所以这里也是空行。

响应报文

HTTP/1.1 200 OK             //状态行
Server: openresty           //响应报头
Date: Sun, 30 Jul 2017 07:09:01 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-Length: 51577
                        //空格
<!DOCTYPE html PUBLIC 太长省略了。    //响应正文

post请求

请求报文

POST http://120.25.226.186:32812/login HTTP/1.1
Host: 120.25.226.186:32812
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Content-Length: 24

username=520it&pwd=520it

响应报文

HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Sun, 30 Jul 2017 08:17:09 GMT

1a
{"success":"登录成功"}
0

欢迎大家关注、评论、点赞
你们的支持是我坚持的动力。

推荐阅读更多精彩内容