Android 网络编程1 Http协议

作者 : 开心源码 本文共8837个字,预计阅读时间需要23分钟 发布时间: 2022-05-11 共60人阅读

Android网络编程 目录

1.HTTP简介

  1. HTTP协议,即超文本传输协议(Hypertext transfer protocol)。是一种详细规定了浏览器和万维网(WWW = World Wide Web)服务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
  2. HTTP协议作为TCP/IP模型中应使用层的协议也不例外。HTTP协议通常承载于TCP协议之上,有时也承载于TLS或者SSL协议层之上,这个时候,就成了我们常说的HTTPS。如下图:

  1. HTTP是一个应使用层协议,由请求和响应构成,是一个标准的用户端服务器模型。HTTP是一个无状态的协议。
  2. HTTP默认的端口号为80,HTTPS的端口号为443
  3. 浏览网页是HTTP的主要应使用,但是这并不代表HTTP就只可以应使用于网页的浏览。HTTP是一种协议,只需通信的双方都遵守这个协议,HTTP就可以有使用武之地。比方咱们常使用的QQ,迅雷这些软件,都会用HTTP协议(还包括其余的协议)。

2.Http协议的特点

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

3.HTTP协议工作流程

HTTP是基于传输层的TCP协议,而TCP是一个端到端的面向连接的协议。所谓的端到端能了解为进程到进程之间的通信。所以HTTP在开始传输之前,首先需要建立TCP连接,而TCP连接的过程需要所谓的“三次握手”。下图所示TCP连接的三次握手。
在TCP三次握手之后,建立了TCP连接,此时HTTP即可以进行传输了。一个重要的概念是面向连接,既HTTP在传输完成之间并不断开TCP连接。在HTTP1.1中(通过Connection头设置)这是默认行为。

  1. 用户端和服务器之间建立一条连接
  2. 连接建立后,用户端向服务器发起一个请求(request)
  3. 服务器收到一个请求后,给用户端一个响应(应答,response)
  4. 用户端收到响应后做进一步解决

4.HTTP之URL

HTTP用统一资源标识符(Uniform Resource Identifiers, URI)来传输数据和建立连接。URL是一种特殊类型的URI,包含了使用于查找某个资源的足够的信息

URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上使用来标识某一处资源的地址。以下面这个URL为例,详情下普通URL的各部分组成:

http://www.tencent.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name

从上面的URL能看出,一个完整的URL包括以下几部分:
1.协议部分:该URL的协议部分为“http:”,这代表网页用的是HTTP协议。在Internet中能用多种协议,如HTTP,FTP等等本例中用的是HTTP协议。在”HTTP”后面的“//”为分隔符

2.域名部分:该URL的域名部分为“www.tencent.com”。一个URL中,也能用IP地址作为域名用

3.端口部分:跟在域名后面的是端口,域名和端口之间用“:”作为分隔符。端口不是一个URL必需的部分,假如省略端口部分,将采使用默认端口

4.虚拟目录部分:从域名后的第一个“/”开始到最后一个“/”为止,是虚拟目录部分。虚拟目录也不是一个URL必需的部分。本例中的虚拟目录是“/news/”

5.文件名部分:从域名后的最后一个“/”开始到“?”为止,是文件名部分,假如没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,假如没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必需的部分,假如省略该部分,则用默认的文件名

6.锚部分:从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必需的部分

7.参数部分:从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数能允许有多个参数,参数与参数之间使用“&”作为分隔符。

(原文:http://blog.csdn.net/ergouge/article/details/8185219 )

5.URI和URL的区别

5.1.URI,是uniform resource identifier,统一资源标识符,使用来唯一的标识一个资源。

Web上可使用的每种资源如HTML文档、图像、视频片段、程序等都是一个来URI来定位的
URI一般由三部组成:

  • 访问资源的命名机制
  • 存放资源的主机名
  • 资源自身的名称,由路径表示,着重强调于资源。
5.2.URL是uniform resource locator,统一资源定位器,它是一种具体的URI,即URL能使用来标识一个资源,而且还指明了如何locate这个资源。

URL是Internet上使用来形容信息资源的字符串,主要使用在各种WWW用户程序和服务器程序上,特别是著名的Mosaic。
采使用URL能使用一种统一的格式来形容各种信息资源,包括文件、服务器的地址和目录等。URL一般由三部组成:
①协议(或者称为服务方式)
②存有该资源的主机IP地址(有时也包括端口号)
③主机资源的具体地址。如目录和文件名等

5.3.URN,uniform resource name,统一资源命名,是通过名字来标识资源,比方mailto:java-net@java.sun.com。

URI是以一种笼统的,高层次概念定义统一资源标识,而URL和URN则是具体的资源标识的方式。URL和URN都是一种URI。抽象地说,每个 URL 都是 URI,但不肯定每个 URI 都是 URL。这是由于 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。上面的 mailto、news 和 isbn URI 都是 URN 的示例。

在Java的URI中,一个URI实例能代表绝对的,也能是相对的,只需它符合URI的语法规则。而URL类则不仅符合语义,还包含了定位该资源的信息,因而它不可以是相对的。
在Java类库中,URI类不包含任何访问资源的方法,它唯一的作使用就是解析。
相反的是,URL类能打开一个到达资源的流。

6.HTTP的几种请求方式

请求方式作使用
Get请求获取Request-URI所标识的资源
Post在Request-URI所标识的资源后附加新的数据
HEAD请求获取由Request-URI所标识的资源的响应消息报头。
PUT请求服务器存储一个资源,并使用Request-URI作为其标识。
DELETE请求服务器删除Request-URI所标识的资源。
TRACE请求服务器回送收到的请求信息,主要使用于测试或者诊断。
CONNECTHTTP/1.1协议中预留给可以够将连接改为管道方式的代理商服务器。
OPTIONS请求查询服务器的性可以,或者者查询与资源相关的选项。
PATCH使用来将局部修改应使用于某一资源,增加于规范RFC5789。

7.HTTP请求头和响应头

7.1HTTP Request Header 请求头
Header解释示例
Accept指定用户端可以够接收的内容类型Accept: text/plain, text/html
Accept-Charset浏览器能接受的字符编码集。Accept-Charset: iso-8859-5
Accept-Encoding指定浏览器能支持的web服务器返回内容压缩编码类型。Accept-Encoding: compress, gzip
Accept-Language浏览器可接受的语言Accept-Language: en,zh
Accept-Ranges能请求网页实体的一个或者者多个子范围字段Accept-Ranges: bytes
AuthorizationHTTP受权的受权证书Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cache-Control指定请求和响应遵循的缓存机制Cache-Control: no-cache
Connection表示能否需要持久连接。(HTTP 1.1默认进行持久连接)Connection: close
CookieHTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。Cookie: $Version=1; Skin=new;
Content-Length请求的内容长度Content-Length: 348
Content-Type请求的与实体对应的MIME信息Content-Type: application/x-www-form-urlencoded
Date请求发送的日期和时间Date: Tue, 15 Nov 2010 08:12:31 GMT
Expect请求的特定的服务器行为Expect: 100-continue
From发出请求的使用户的EmailFrom: user@email.com
Host指定请求的服务器的域名和端口号Host: www.zcmhi.com
If-Match只有请求内容与实体相匹配才有效If-Match: “737060cd8c284d8af7ad3082f209582d”
If-Modified-Since假如请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
If-None-Match假如内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断能否改变If-None-Match: “737060cd8c284d8af7ad3082f209582d”
If-Range假如实体未改变,服务器发送用户端丢失的部分,否则发送整个实体。参数也为EtagIf-Range: “737060cd8c284d8af7ad3082f209582d”
If-Unmodified-Since只在实体在指定时间之后未被修改才请求成功If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
Max-Forwards限制信息通过代理商和网关传送的时间Max-Forwards: 10
Pragma使用来包含实现特定的指令Pragma: no-cache
Proxy-Authorization连接到代理商的受权证书Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range只请求实体的一部分,指定范围Range: bytes=500-999
Referer先前网页的地址,当前请求网页紧随其后,即来路Referer: http://www.zcmhi.com/archives/71.html
TE用户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 TE:trailers,deflate;q=0.5
Upgrade向服务器指定某种传输协议以便服务器进行转换(假如支持)Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
User-AgentUser-Agent的内容包含发出请求的使用户信息User-Agent: Mozilla/5.0 (Linux; X11)
Via通知中间网关或者代理商服务器地址,通信协议Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning关于消息实体的警告信息Warning: 199 Miscellaneous warning
7.2HTTP Responses Header 响应头
Header解释示例
Accept-Ranges表明服务器能否支持指定范围请求及哪种类型的分段请求Accept-Ranges: bytes
Age从原始服务器到代理商缓存形成的估算时间(以秒计,非负)Age: 12
Allow对某网络资源的有效的请求行为,不允许则返回405Allow: GET, HEAD
Cache-Control告诉所有的缓存机制能否能缓存及哪种类型Cache-Control: no-cache
Content-Encodingweb服务器支持的返回内容压缩编码类型。Content-Encoding: gzip
Content-Language响应体的语言Content-Language: en,zh
Content-Length响应体的长度Content-Length: 348
Content-Location请求资源可替代的备使用的另一地址Content-Location: /index.htm
Content-MD5返回资源的MD5校验值Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Range在整个返回体中本部分的字节位置Content-Range: bytes 21010-47021/47022
Content-Type返回内容的MIME类型Content-Type: text/html; charset=utf-8
Date原始服务器消息发出的时间Date: Tue, 15 Nov 2010 08:12:31 GMT
ETag请求变量的实体标签的当前值ETag: “737060cd8c284d8af7ad3082f209582d”
Expires响应过期的日期和时间Expires: Thu, 01 Dec 2010 16:00:00 GMT
Last-Modified请求资源的最后修改时间Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT
Location使用来重定向接收方到非请求URL的位置来完成请求或者标识新的资源Location: http://www.zcmhi.com/archives/94.html
Pragma包括实现特定的指令,它可应使用到响应链上的任何接收方Pragma: no-cache
Proxy-Authenticate它指出认证方案和可应使用到代理商的该URL上的参数Proxy-Authenticate: Basic
refresh应使用于重定向或者一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)Refresh: 5; url=http://www.zcmhi.com/archives/94.html
Retry-After假如实体暂时不可取,通知用户端在指定时间之后再次尝试Retry-After: 120
Serverweb服务器软件名称Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
Set-Cookie设置Http CookieSet-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
Trailer指出头域在分块传输编码的尾部存在Trailer: Max-Forwards
Transfer-Encoding文件传输编码Transfer-Encoding:chunked
Vary告诉下游代理商是用缓存响应还是从原始服务器请求Vary: *
Via告知代理商用户端响应是通过哪里发送的Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning警告实体可可以存在的问题Warning: 199 Miscellaneous warning
WWW-Authenticate表明用户端请求实体应该用的受权方案WWW-Authenticate: Basic

8.HTTP状态码

8.1.HTTP状态码的分类

HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作使用。

HTTP状态码共分为5种类型:
分类分类形容
1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并解决
3**重定向,需要进一步的操作以完成请求
4**用户端错误,请求包含语法错误或者无法完成请求
5**服务器错误,服务器在解决请求的过程中发生了错误
8.2.HTTP状态码表详解
状态码状态码英文名称中文形容
100Continue继续。用户端应继续其请求
101Switching Protocols切换协议。服务器根据用户端的请求切换协议。只可以切换到更高级的协议,例如,切换到HTTP的新版本协议
200OK 请求成功。一般使用于GET与POST请求
201Created 已创立。成功请求并创立了新的资源
202Accepted 已接受。已经接受请求,但未解决完成
203Non-Authoritative Information非受权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204No Content无内容。服务器成功解决,但未返回内容。在未升级网页的情况下,可确保浏览器继续显示当前文档
205Reset Content重置内容。服务器解决成功,使用户终端(例如:浏览器)应重置文档视图。可通过此返回码清理浏览器的表单域
206Partial Content部分内容。服务器成功解决了部分GET请求
300Multiple Choices多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表使用于使用户终端(例如:浏览器)选择
301Moved Permanently永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应用新的URI代替
302Found临时移动。与301相似。但资源只是临时被移动。用户端应继续用原有URI
303See Other查看其它地址。与301相似。用GET和POST请求查看
304Not Modified未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。用户端通常会缓存访问过的资源,通过提供一个头信息指出用户端希望只返回在指定日期之后修改的资源
305Use Proxy用代理商。所请求的资源必需通过代理商访问
306Unused已经被废弃的HTTP状态码
307Temporary Redirect临时重定向。与302相似。用GET请求重定向
400Bad Request用户端请求的语法错误,服务器无法了解
401Unauthorized请求要求使用户的身份认证
402Payment Required保留,将来用
403Forbidden服务器了解请求用户端的请求,但是拒绝执行此请求
404Not Found服务器无法根据用户端的请求找到资源(网页)。通过此代码,网站设计人员能设置”您所请求的资源无法找到”的个性页面
405Method Not Allowed用户端请求中的方法被禁止
406Not Acceptable服务器无法根据用户端请求的内容特性完成请求
407Proxy Authentication Required请求要求代理商的身份认证,与401相似,但请求者应当用代理商进行受权
408Request Time-out服务器等待用户端发送的请求时间过长,超时
409Conflict服务器完成用户端的PUT请求是可可以返回此代码,服务器解决请求时发生了冲突
410Gone用户端请求的资源已经不存在。410不同于404,假如资源以前有现在被永久删除了可用410代码,网站设计人员可通过301代码指定资源的新位置
411Length Required服务器无法解决用户端发送的不带Content-Length的请求信息
412Precondition Failed用户端请求信息的先决条件错误
413Request Entity Too Large因为请求的实体过大,服务器无法解决,因而拒绝请求。为防止用户端的连续请求,服务器可可以会关闭连接。假如只是服务器暂时无法解决,则会包含一个Retry-After的响应信息
414Request-URI Too Large请求的URI过长(URI通常为网址),服务器无法解决
415Unsupported Media Type服务器无法解决请求附带的媒体格式
416Requested range not satisfiable用户端请求的范围无效
417Expectation Failed服务器无法满足Expect的请求头信息
500Internal Server Error服务器内部错误,无法完成请求
501Not Implemented服务器不支持请求的功可以,无法完成请求
502Bad Gateway充任网关或者代理商的服务器,从远端服务器接收到了一个无效的请求
503Service Unavailable因为超载或者系统维护,服务器暂时的无法解决用户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504Gateway Time-out充任网关或者代理商的服务器,未及时从远端服务器获取请求
505HTTP Version not supported服务器不支持请求的HTTP协议的版本,无法完成解决
特别感谢:

ranyonsue
雨点的名字

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Android 网络编程1 Http协议

发表回复