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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容