Android 网络编程 - HTTP协议
2017-07-26 16:32
239 查看
HTTP(Hyper Text Transfer Protocol,超文本传输协议)协议是基于TCP/IP通信协议来传递数据,属于应用层的面向对象的协议。
灵活:HTTP允许传输任意类型的数据对象,传输的类型由Content-Type加以标记。
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
GET例子:
请求行: 包括3部分:请求方法(GET),请求资源(/hello.txt),HTTP版本(HTTP/1.1)。
请求头部: 一般是key:value形式,记录请求一些基本信息,如Host(服务器地址)等。
空行: 必须有,即使没有数据。
请求数据: 请求时提供的数据,可以没有。
POST例子:
常见的请求头部:
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请求报头域,那么服务器端就无法得知我们的信息了。
状态行: 包括3部分:HTTP协议(HTTP/1.1),状态码(200),状态消息(OK)。
消息报头: 类似于请求头部,也是以key:value,记录响应基本消息。
空行: 必须有,即使没有数据。
响应正文: 服务器返回来的内容。
状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
常见状态码:
更多状态码,请参考: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提交的数据大小有限制(因为浏览器对URL的长度有限制,貌似是1K),而POST方法提交的数据没有限制。
GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。
关于HTTP协议,一篇就够了
HTTP协议详解(真的很经典)
特点
支持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.3 Host: www.example.com Accept-Language: en, mi // 空行(必须有) // 请求数据(可以没有)
请求行: 包括3部分:请求方法(GET),请求资源(/hello.txt),HTTP版本(HTTP/1.1)。
请求头部: 一般是key:value形式,记录请求一些基本信息,如Host(服务器地址)等。
空行: 必须有,即使没有数据。
请求数据: 请求时提供的数据,可以没有。
POST例子:
// 请求行 POST / HTTP1.1 // 请求头部 Host:www.wrox.com User-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-urlencoded Content-Length:40 Connection: 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 GMT Content-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:输入了错误的URL 500 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协议详解(真的很经典)
相关文章推荐
- Android网络编程之socket和http协议的区别
- Android网络编程专栏--Http协议详细解析
- Android网络编程之TCP/IP,HTTP,HTTPS协议了解
- [转]android 网络编程 HttpGet类和HttpPost类使用详解
- Http与Android网络请求的几种协议
- android网络编程之HttpUrlConnection的讲解--实现文件的断点上传
- android网络编程之HttpUrlConnection的讲解--DownLoadManager基本用法
- android网络编程--HttpURLConnection(结合Handler和子线程)
- Android网络编程之Http请求服务器数据(POST方式)
- Android网络编程之Socket&Http
- Android网络编程之Http通信
- Android网络编程之HttpClient
- Android网络编程之Http通信
- Android 网络编程(三)HttpURLConnection
- Android 网络编程之 Http 通信
- android 网络编程 HttpGet和HttpPost类使用详解
- Android - HTTP 协议访问网络
- Android网络编程之Http通信
- ios网络编程协议---http
- android 网络编程--socket tcp/ip udp http之间的关系