Android 网络编程

来源:互联网 发布:山东大学 李利平 知乎 编辑:程序博客网 时间:2024/06/07 23:12

HTTP(Hyper Text Transfer Protocol,超文本传输协议)协议是基于TCP/IP通信协议来传递数据,属于应用层面向对象的协议。

特点

  • 支持C/S和B/S模式。
  • 灵活:HTTP允许传输任意类型的数据对象,传输的类型由Content-Type加以标记。
  • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

消息结构

(1)请求结构

HTTP请求结构包括4部分:请求行,请求头部,空行,请求数据。

GET例子:

// 请求行GET /hello.txt HTTP/1.1// 请求头部User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3Host: www.example.comAccept-Language: en, mi// 空行(必须有)// 请求数据(可以没有)

请求行: 包括3部分:请求方法(GET),请求资源(/hello.txt),HTTP版本(HTTP/1.1)。
请求头部: 一般是key:value形式,记录请求一些基本信息,如Host(服务器地址)等。
空行: 必须有,即使没有数据。
请求数据: 请求时提供的数据,可以没有。

POST例子:

// 请求行POST / HTTP1.1// 请求头部Host:www.wrox.comUser-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)Content-Type:application/x-www-form-urlencodedContent-Length:40Connection: Keep-Alive// 空行// 请求数据name=Professional%20Ajax&publisher=Wiley

常见的请求头部:

Accept: 用于指定客户端接受哪些类型的信息。如Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。

Accept-Charset: 用于指定客户端接受的字符集。如Accept-Charset:gb2312,如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

Accept-Encoding: 用于指定可接受的内容编码。如Accept-Encoding:gzip,如果请求消息中没有设置这个域,服务器假定客户端对各种内容编码都可以接受。

Accept-Language: 用于指定可接受的自然语言。如Accept-Language:zh-cn,如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。

Authorization: 用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。

Host: 发送请求时,该报头域是必需的。用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,如我们在浏览器中输入:http://www.guet.edu.cn/index.html,浏览器发送的请求消息中,就会包含Host请求报头域,Host:www.guet.edu.cn,此处使用缺省端口号80,若指定了端口号,则变成:Host:www.guet.edu.cn:指定端口号。

User-Agent: 我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了。

(2)响应结构

HTTP响应结构包括4部分:状态行,消息报头,空行,响应正文。

// 状态行HTTP/1.1 200 OK// 消息报头Date: Fri, 22 May 2009 06:07:21 GMTContent-Type: text/html; charset=UTF-8// 空行// 响应正文<html>      <head></head>      <body>            <!--body goes here-->      </body></html>

状态行: 包括3部分:HTTP协议(HTTP/1.1),状态码(200),状态消息(OK)。
消息报头: 类似于请求头部,也是以key:value,记录响应基本消息。
空行: 必须有,即使没有数据。
响应正文: 服务器返回来的内容。

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求

常见状态码:

200 OK                        //客户端请求成功400 Bad Request               //客户端请求有语法错误,不能被服务器所理解401 Unauthorized              //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 403 Forbidden                 //服务器收到请求,但是拒绝提供服务404 Not Found                 //请求资源不存在,eg:输入了错误的URL500 Internal Server Error     //服务器发生不可预期的错误503 Server Unavailable        //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

更多状态码,请参考:http://www.runoob.com/http/http-status-codes.html

常用的消息报头:

Server: 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。
Set-Cookie: 设置和页面关联的Cookie。
Location: 重定向的地址。如果状态码为3xx,可以根据Location取出重定向地址。
Expires: 用于数据的过期时间,也就是缓存时间。

更多消息报头,请参考:http://www.runoob.com/http/http-header-fields.html

GET和POST区别

  • GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456。POST方法是把提交的数据放在HTTP包的Body中。

  • GET提交的数据大小有限制(因为浏览器对URL的长度有限制,貌似是1K),而POST方法提交的数据没有限制。

  • GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。

  • GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。

参考资料

HTTP 教程
关于HTTP协议,一篇就够了
HTTP协议详解(真的很经典)

原创粉丝点击