HTTP协议

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响应消息,就要决定是否请求服务器对其进行验证。

响应正文

消息报头和响应正文之间是一个空行,这个空行表示消息报头已经结束,接下来的是响应正文。响应正文就是服务器返回资源的内容。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值