Http协议

来源:互联网 发布:故事板软件苹果 编辑:程序博客网 时间:2024/06/12 23:19

老早就学了Http协议,但是最开始学HTTP协议的时候,没有从内心意识到他的地位之高,它的使用范围之广。那时候学习的时候,基本时联系到平时使用的Apache Http包或者Java HttpUrlConnection来考虑了。更多地是在应用,或者说是比较,但是最近接触到的各种知识,像REST规范。以及使用的API各种接口。越来越觉得HTTP协议是简单但重要的东西。以前对HTTP协议,是从应用来考虑的,而现在我觉得应该从协议上面来重新学习一下。

请求消息

平时使用最多的,接触最多的,都是POST方式,GET方式请求,其实这只是HTTP协议中请求的Method而已。HTTP协议的第一行(请求行)就是包括下面这些内容:

METHOD URI  VERSION CRLF

example:

GET /index.html http/1.0 CRLF 

对应中文的解释分别是:Http请求方法,uri路径,http协议版本(有1.0和1.1),回车换行。而HTTP协议中,METHOD有GET,POST,HEAD,PUT,DELETE,TRACE。

在请求行之后,整个请求头还有一系列的请求报头,像Host(HTTP1.1中,Host是必须的),Accept,If-Modified-Since等等。在请求消息报头后面,还有一个请求体,POST请求内容就放请求体中,而GET请求则放在url后面(?param1=1&param2=2)。

这是一个非常简单的请求的例子:

GET /index.html http/1.1 CRLFHost:localhost:8080Accept:*/*

响应消息

响应消息是指HTTP协议返回的消息,包括状态行,响应头,响应体。状态行格式如下所示:

HTTP-VERSION STATUS-Code RESULT-Phrase

比如:

http/1.1 200 ok

在状态行之后就是响应头,响应头类似于请求头,包含了响应的一些信息,以key:value的形式,其中包括诸如Allow,Date,Content-Length等。这个里面每个响应头都有重要用处,在平时的使用中,如果能够理解这些,对于一些请求错误,会有非常大的帮助,就比如说Encoding,Language。乱码就是来源于请求头,和响应头的这些信息不对。

在响应头之后,就是响应体,HTTP返回的附加内容就是放在响应体当中。比如请求文件,那么文件内容就在这个里面。

GET与POST的区别

在平常对HTTP的使用当中,用的最多的就是这两个了,这两个大部分的区别平常基本是明了的:

  1. GET的参数放在url后面,而POST的参数放在body里面。这样GET的参数长度有限制(1024),而POST长度没有限制。另外这样,POST请求也更加安全。参数放在url中,会有纪录。而被人查看到。
  2. GET没有body,而POST有body
  3. 服务器解析GET参数是从Request.QueryString中解析,而POST是从Request.Form中解析。这一点需要特别注意,特别是在使用一些没有对请求参数进行封装的HTTP包的时候。

HTTP与具体代码

很多人可能一开始接触的不是协议,而是代码。而现在很多应用包都非常好地封装了HTTP协议。如果不去了解HTTP协议,对于这些封装的API函数,显然是无法彻底熟悉的。

其实从HTTP协议上面来看,那些对HTTP请求控制的API,可以分成三个部分,请求方法,请求头内容设置,请求体写入。同样响应也是一样的。从这个思路上去看HTTP请求与响应,对于HTTP的处理就会非常清晰明了。

我们使用最多的可能时响应行中的状态码,我们经常会遇到4开头,5开头的错误。遇到这种,从状态码就可以发现是什么错误原因了。比如说503,那可能是服务器出现错误了,去查看服务器的日志。如果404,就可以考虑是不是自己的url写错了某个字母。

除了状态码外,响应头跟请求头的对应也是非常重要。还有有时候,得到的响应内容是乱码的,这个时候就要看客户端解码是否使用了正确的编码,服务器端写入是否采用了正确的编码,根HTTP响应头协议中的编码格式是否一致。很快就可以查找出来,而不是拿着乱码的错误,到处google,百度,搜索引擎很多时候都不如自己明白详里后,查找原因并且解决问题来的快。

0 0