Android 网络详解(二) HTTP协议

来源:互联网 发布:乐乎公寓ifeng 编辑:程序博客网 时间:2024/05/22 03:07
上一篇讲述了TCP协议与UDP协议,这一篇我们来讲一讲基于TCP协议的HTTP协议。


HTTP协议位于应用层,建立在TCP协议之上,也属于面向连接的可靠传输。它不再像TCP连接那样需要指定端口号,因为HTTP协议默认使用80号端口。

机器的端口号分为0~65536,其中,0~1024号端口被系统占用,其余端口可由用户自由分配。例如HTTP协议占用了80/tcp号端口,HTTPS协议占用了443/tcp,443/udp号端口,FTP协议占用了21/tcp号端口,TELNET协议占用了23/tcp号端口。


这样,建立HTTP连接时只需要指定IP地址就可以了。


在Android中,HTTP协议封装在HttpURLConnection类中,其内部也是使用Socket进行通信,只是它对Socket进行了封装,使我们可以更方便地进行调用。下面讲一讲,HTTP里丰富了哪些信息。

Socket更适用于保持长连接,HttpURLConnection一般用于短连接。

这篇文章分析了Socket与HttpURLConnection的使用区别:

Socket、URLConnection 和HttpURLConnection的区别


HTTP传输的信息分为请求信息与响应信息。客户端向服务端发送请求信息,服务端向客户端发送响应信息。

上图是HTTP的请求数据格式。

HTTP的请求方法有:

GET,POST,PUT,DELETE

GET方法用于向服务器获取信息,但可以使用该方法提交少量信息,大小受限制,这与服务器,客户端以及操作系统有关。

POST方法用于向服务器提交信息,上传的信息理论上是没有限制的。

PUT方法用于更新服务器上的资源。

DELETE方法用于删除服务器上的资源。

URL为统一资源标识符,为资源在互联网中的唯一标识,这也是请求信息要发送到的目的地。

协议版本为HTTP的版本号。

HTTP的请求数据中还会包含一些头部字段,用来设置此次HTTP连接的属性。

HTTP请求的头属性有:

HTTP Request Header 请求头

Header解释示例Accept指定客户端能够接收的内容类型Accept: text/plain, text/htmlAccept-Charset浏览器可以接受的字符编码集。Accept-Charset: iso-8859-5Accept-Encoding指定浏览器可以支持的web服务器返回内容压缩编码类型。Accept-Encoding: compress, gzipAccept-Language浏览器可接受的语言Accept-Language: en,zhAccept-Ranges可以请求网页实体的一个或者多个子范围字段Accept-Ranges: bytesAuthorizationHTTP授权的授权证书Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==Cache-Control指定请求和响应遵循的缓存机制Cache-Control: no-cacheConnection表示是否需要持久连接。(HTTP 1.1默认进行持久连接)Connection: close,keep-aliveCookieHTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。Cookie: $Version=1; Skin=new;Content-Length请求的内容长度Content-Length: 348Content-Type请求的与实体对应的MIME信息Content-Type: application/x-www-form-urlencodedDate请求发送的日期和时间Date: Tue, 15 Nov 2010 08:12:31 GMTExpect请求的特定的服务器行为Expect: 100-continueFrom发出请求的用户的EmailFrom: user@email.comHost指定请求的服务器的域名和端口号Host: www.zcmhi.comIf-Match只有请求内容与实体相匹配才有效If-Match: “737060cd8c284d8af7ad3082f209582d”If-Modified-Since如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMTIf-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 GMTMax-Forwards限制信息通过代理和网关传送的时间Max-Forwards: 10Pragma用来包含实现特定的指令Pragma: no-cacheProxy-Authorization连接到代理的授权证书Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==Range只请求实体的一部分,指定范围Range: bytes=500-999Referer先前网页的地址,当前请求网页紧随其后,即来路Referer: http://www.zcmhi.com/archives/71.htmlTE客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息TE: trailers,deflate;q=0.5Upgrade向服务器指定某种传输协议以便服务器进行转换(如果支持)Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11User-AgentUser-Agent的内容包含发出请求的用户信息User-Agent: Mozilla/5.0 (Linux; X11)Via通知中间网关或代理服务器地址,通信协议Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)Warning关于消息实体的警告信息Warn: 199 Miscellaneous warning设置Accept-Charset,来说明客户端可以接收的字符编码集,可以设置为utf-8等。

设置Cookie属性,来上传客户端向服务端提交的数据。Cookie用于证明客户端的身份,使服务端鉴别连接的客户端。

设置Connection属性为keep-alive,表示客户端希望与服务端保持长连接,但并不是一定可以保持长连接,还需要考虑服务端的状况。HTTP1.1默认进行长连接。

设置Range属性bytes=X-Y,表示获取实体字节数X到Y的部分,如果不设置Y,设置为bytes=X-,则表示从字节数X开始,获取整个实体。该属性一般用于断点续传。

设置User-Agent属性,来说明客户端的用户信息,如浏览器信息,Mozilla/5.0。通过设置该属性来伪装客户端身份,明明是用自己的程序发的请求,也可以伪装成浏览器。有些地址服务器只允许浏览器获取,这时设置该属性就会很有效。


HTTP Responses Header 响应头

Header解释示例Accept-Ranges表明服务器是否支持指定范围请求及哪种类型的分段请求Accept-Ranges: bytesAge从原始服务器到代理缓存形成的估算时间(以秒计,非负)Age: 12Allow对某网络资源的有效的请求行为,不允许则返回405Allow: GET, HEADCache-Control告诉所有的缓存机制是否可以缓存及哪种类型Cache-Control: no-cacheContent-Encodingweb服务器支持的返回内容压缩编码类型。Content-Encoding: gzipContent-Language响应体的语言Content-Language: en,zhContent-Length响应体的长度Content-Length: 348Content-Location请求资源可替代的备用的另一地址Content-Location: /index.htmContent-MD5返回资源的MD5校验值Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==Content-Range在整个返回体中本部分的字节位置Content-Range: bytes 21010-47021/47022Content-Type返回内容的MIME类型Content-Type: text/html; charset=utf-8Date原始服务器消息发出的时间Date: Tue, 15 Nov 2010 08:12:31 GMTETag请求变量的实体标签的当前值ETag: “737060cd8c284d8af7ad3082f209582d”Expires响应过期的日期和时间Expires: Thu, 01 Dec 2010 16:00:00 GMTLast-Modified请求资源的最后修改时间Last-Modified: Tue, 15 Nov 2010 12:45:26 GMTLocation用来重定向接收方到非请求URL的位置来完成请求或标识新的资源Location: http://www.zcmhi.com/archives/94.htmlPragma包括实现特定的指令,它可应用到响应链上的任何接收方Pragma: no-cacheProxy-Authenticate它指出认证方案和可应用到代理的该URL上的参数Proxy-Authenticate: Basicrefresh应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)
 

 

Refresh: 5; url=
http://www.zcmhi.com/archives/94.html
Retry-After如果实体暂时不可取,通知客户端在指定时间之后再次尝试Retry-After: 120Serverweb服务器软件名称Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)Set-Cookie设置Http CookieSet-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1Trailer指出头域在分块传输编码的尾部存在Trailer: Max-ForwardsTransfer-Encoding文件传输编码Transfer-Encoding:chunkedVary告诉下游代理是使用缓存响应还是从原始服务器请求Vary: *Via告知代理客户端响应是通过哪里发送的Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)Warning警告实体可能存在的问题Warning: 199 Miscellaneous warningWWW-Authenticate表明客户端请求实体应该使用的授权方案WWW-Authenticate: Basic
Content-Language表示响应内容的语言,Content-Length属性表示响应的内容的长度,Content-Type属性表示响应的内容的MIME信息,即响应内容的类型信息。

Set-Cookie属性的内容为服务端为客户端设置的Cookie,用来标识客户端的身份,当客户端下次发送请求时,带上Cookie,服务端便可以识别客户端了。


HTTP的返回码:
对于每个HTTP请求,服务端都会返回一个返回码,说明请求的相应情况。HTTP的返回码分为五种类型:

1××  保留  
2××
  表示请求成功地接收  
3××
  为完成请求客户需进一步细化请求  
4××
  客户错误  
5××
  服务器错误 

1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。代码   说明 100   (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。  101   (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。 2xx (成功)表示成功处理了请求的状态代码。代码   说明 200   (成功)  服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。 201   (已创建)  请求成功并且服务器创建了新的资源。 202   (已接受)  服务器已接受请求,但尚未处理。 203   (非授权信息)  服务器已成功处理了请求,但返回的信息可能来自另一来源。 204   (无内容)  服务器成功处理了请求,但没有返回任何内容。 205   (重置内容) 服务器成功处理了请求,但没有返回任何内容。206   (部分内容)  服务器成功处理了部分 GET 请求。 3xx (重定向) 表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。代码   说明 300   (多种选择)  针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。 301   (永久移动)  请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。302   (临时移动)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。303   (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。304   (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。 305   (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。 307   (临时重定向)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。 4xx(请求错误) 这些状态代码表示请求可能出错,妨碍了服务器的处理。代码   说明 400   (错误请求) 服务器不理解请求的语法。 401   (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。 403   (禁止) 服务器拒绝请求。404   (未找到) 服务器找不到请求的网页。405   (方法禁用) 禁用请求中指定的方法。 406   (不接受) 无法使用请求的内容特性响应请求的网页。 407   (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。408   (请求超时)  服务器等候请求时发生超时。 409   (冲突)  服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。 410   (已删除)  如果请求的资源已永久删除,服务器就会返回此响应。 411   (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。 412   (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。 413   (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。 414   (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。 415   (不支持的媒体类型) 请求的格式不受请求页面的支持。 416   (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。 417   (未满足期望值) 服务器未满足"期望"请求标头字段的要求。 5xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。代码   说明 500   (服务器内部错误)  服务器遇到错误,无法完成请求。 501   (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。 502   (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。 503   (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。 504   (网关超时)  服务器作为网关或代理,但是没有及时从上游服务器收到请求。 505   (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
在Android中,HTTP协议被封装在HttpURLConnection类中,如下面的代码,
try {            URL url = new URL(IP);            HttpURLConnection connection = (HttpURLConnection) url.openConnection();            connection.setRequestMethod("POST");            connection.setDoInput(true);            connection.setDoOutput(true);            connection.setRequestProperty("connection", "keep-alive");            connection.setRequestProperty("accept-charset", "utf-8");            connection.connect();            BufferedInputStream bin = new BufferedInputStream(connection.getInputStream());            BufferedOutputStream bout = new BufferedOutputStream(connection.getOutputStream());            connection.disconnect();} catch(Exception e) {}

通过调用HttpURLConnection的setRequestProperty方法来设置头属性,该方法有两个参数,第一个参数为头属性的名字,大小写都可以;第二个参数为该属性的值。

使用setRequestMethod方法设置请求的方法,setDoInput(boolean)和setDoOutput(boolean)方法设置客户端是否可以进行输入和输出。GET方法一般用不到输出,setDoOutput默认为false。setReadTimeout(int timeout)和setConnectTimeout(int timeout)方法设置连接读取内容的超时时间和建立连接的超时时间,超过设置的时长就会报出TimeOut。

使用HttpURLConnection的getContentType和getContentLength方法,可以获得响应内容的文件类型和响应内容的大小。

HTTP的断点续传原理,就是设置请求的头属性Range,如connection.setRequestProperty("range","bytes=1000-2000");这样就会只获取请求内容的第1000到第2000的字节。

HTTP的缓存机制

okHttp


0 0
原创粉丝点击