HTTP协议是一个基于请求/响应模式的、无状态的协议。HTTP是应用层的协议,其下层是利用TCP协议来完成的。在HTTP1.0中,当连接建立后,客户端(浏览器)发送一个请求,服务器回应一个消息,之后,连接就被关闭了。在HTTP1.1中,给出了一个持续连接的机制,客户端(浏览器)在建立一个连接之后,发送请求得到回应,然后可以继续发送请求并再次得到回应。
HTTP请求由三部分组成:请求行、消息报头和请求正文。
请求行
请求行以一个方法符号开头、后面跟着请求URI和协议的版本,以CRLF(回车换行)作为结尾。请求行以空格分隔,除了作为结尾的CRLF外,不允许出现单独的CR或LF字符。例如:GET /form.html HTTP/1.1 (CRLF)
在HTTP协议中,HTTP请求可以使用多种请求方法,这些方法指明了要以何种方式来访问URI所标识的资源。HTTP1.1支持的请求方法有:
方法 | 作用 |
GET | 请求获取由Request-URI所标识的资源 |
POST | 在Request-URI所标识的资源后附加新的数据 |
HEAD | 请求获取由Request-URI所标识的资源的响应报头 |
PUT | 请求服务器存储一个资源,并用Request-URI作为其标识 |
DELETE | 请求服务器删除由Request-URI所标识的资源 |
TRACE | 请求服务器回送收到的请求消息,主要用于测试或诊断 |
CONNECT | 保留将来使用 |
OPTIONS | 请求查询服务器的性能,或者查询与资源相关的选项和需求 |
消息报头
Cache-Control:用于指定缓存指令,该指令将被请求/响应链中所有的缓存机制所遵循。这些指令将覆盖默认的缓存规则。缓存指令是单向的,在请求中出现的缓存指令,并不意味着在响应中也会出现。请求时的缓存指令包括no-cache,no-store,max-age,max-stale,min-fresh和only-if-cache;响应时的缓存指令包括public,private,no-cache,no-store,no-transform,must-revalidate,proxy-revalidate,max-age和s-maxage。其中最常用的是no-cache,用于指示请求或响应消息不能缓存。
Date:表示消息产生的日期和时间。
Connection:允许发送者指定连接的选项。例如指定连接是持续的,或者指定"close"选项,通知服务器,在响应完成后,关闭连接。
Pragma:用于包含特定实现的指令,这些指令可能会应用到请求/响应链中的任何一个接收者。最常用的是Pragma:no-cache。
Content-Encoding:用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。其主要用于记录文档的压缩方法,例如Content-Encoding: gzip。
Content-Language:描述了资源所用的自然语言。允许用户遵照自身的首选语言来识别和区分实体。如果这个实体内容仅仅打算提供给丹麦的读者,那么可以设置为Content-Language: da。
Content-Length:用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
Content-Type:用于指明发送给接收者的实体正文的媒体类型。例如Content-Type:text/html;charset=GB2312。
Expires:给出响应过期的日期和时间。通常,代理服务器或浏览器会缓存一些页面,当用户再次访问这些页面时,直接从缓存中加载并显示给用户,这样缩短了响应的时间,减少了服务器的负载。为了让代理服务器或浏览器在一段时间后更新页面,我们可以使用Expires实体报头指定页面过期的时间。当用户又一次访问页面时,如果Expires给出的日期和时间比Date报头给出的日期和时间要早(或相同),那么代理服务器或浏览器不再使用缓存页面,而是从服务器请求页面。例如:Expires:Thu, 15 Sep 2005 16:00:00 GMT。
Last-Modified:用于指示资源最后的修改日期和时间。
Accept:用于指定客户端接受哪些类型的信息。例如,Accept: image/gif,表明客户端希望接受GIF图像格式的资源;Accept: text/html,表明接受HTML文本。
Accept-Charset:用于指定客户端接受的字符集。
Accept-Encoding:用于指定可接受的内容编码。例如Accept-Encoding: gzip,deflate。
Accept-Language:用于指定一种自然语言。
Authorization:用于证明客户端有权查看某个资源。
Host:用于指定请求资源的Internet主机和端口号。
User-Agent:允许客户端将它的操作系统、浏览器和其他属性告诉服务器。
请求正文
消息报头和请求正文之间是一个空行,这个空行表示消息报头已经结束,接下来的是请求正文。
GET方法提交的请求没有请求正文,所需的参数是附加在URI的后面传递的。
POST方法提交请求时,数据是以请求正文的方式传递到服务器的,比如参数信息user=zhangsan&&pwd=1234就是请求正文部分。
如果表单中含有file类型,也就是需要上传文件,文件内容信息也会包含在请求正文中传递,其在请求正文中的格式如下:
-----------------------------7d71042a40328
Content-Disposition: form-data; name="fileupload"; filename="file.txt"
Content-Type: text/plain
//此处为文件内容
-----------------------------7d71042a40328
Content-Disposition: form-data; name="submit"
commit
-----------------------------7d71042a40328--
JAVA语言可以利用HttpURLConnection提交Http请求,示例代码如下:
URL url = new URL("http://xxxx");
HttpURLConnection httpurlconnection = (HttpURLConnection) url.openConnection();
httpurlconnection.setDoOutput(true);
httpurlconnection.setRequestMethod("POST");
httpurlconnection.setRequestProperty("Content-Length",xxx);
String username="username=02000001";
httpurlconnection.getOutputStream().write(username.getBytes());
httpurlconnection.getOutputStream().flush();
httpurlconnection.getOutputStream().close();
httpurlconnection.disconnect();
PHP语言可以利用
HttpRequest
提交Http请求,示例代码如下:
<?php
//set up variables
$theData = '<?xml version="1.0"?>
<note>
<to>php.net</to>
<from>lymber</from>
<heading>php http request</heading>
<body>i love php!</body>
</note>';
$url = 'http://www.example.com';
$credentials = 'user@example.com:password';
$header_array = array('Expect' => '',
'From' => 'User A');
$ssl_array = array('version' => SSL_VERSION_SSLv3);
$options = array(headers => $header_array,
httpauth => $credentials,
httpauthtype => HTTP_AUTH_BASIC,
protocol => HTTP_VERSION_1_1,
ssl => $ssl_array);
//create the httprequest object
$httpRequest_OBJ = new httpRequest($url, HTTP_METH_POST, $options);
//add the content type
$httpRequest_OBJ->setContentType = 'Content-Type: text/xml';
//add the raw post data
$httpRequest_OBJ->setRawPostData ($theData);
//send the http request
$result = $httpRequest_OBJ->send();
//print out the result
echo "<pre>"; print_r($result); echo "</pre>";
?>
HTTP响应也是由三个部分组成:状态行、消息报头和响应正文。
状态行
状态行由协议版本、数字形式的状态代码以及相应的状态描述组成,各元素之间以空格分隔,除了结尾的CRLF(回车换行)外,不允许出现CR或LF字符。例如,HTTP/1.1 200 OK。
状态代码由3位数字组成,表示请求是否被理解或被满足,状态描述给出了关于状态代码的简短文本描述。状态代码的第一个数字定义了响应的类别,如下所示:
1xx:指示信息--表示请求已接收,继续处理。
2xx:成功--表示请求已经成功接收、理解、接受。
3xx:重定向--要完成请求必须进行更进一步的操作。
4xx:客户端错误--请求有语法错误或请求无法实现。
5xx:服务器端错误--服务器未能实现合法的请求。
消息报头
Cache-Control,Date,Connection,Pragma,Content-Encoding,Content-Language,Content-Length,Content-Type,Expires,Last-Modified见请求消息报头说明。
Location:用于重定向接受者到一个新的位置。
Server:包含了服务器用来处理请求的软件信息。
WWW-Authenticate:必须被包含在401(未授权的)响应消息中,这个报头域和前面讲到的Authorization请求报头是相关的,当客户端收到401响应消息,就要决定是否请求服务器对其进行验证。
响应正文
消息报头和响应正文之间是一个空行,这个空行表示消息报头已经结束,接下来的是响应正文。响应正文就是服务器返回资源的内容。