Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。
HTTP请求
从使用者的角度看,一个HTTP请求起始于用户端浏览器上输入的一个URL地址;网页中的一个超链接;提交一个HTML表单。但本质上说,一个HTTP请求起始于用户端向HTTP服务器发送的一个URL请求。
一个标准的HTTP请求由以下几个部分组成
<request-line>
<headers>
<CRLF>
[<request-body><CRLF>]
在HTTP请求中,第一行是请求行(request-line),用来说明请求类型、要访问的资源(URL)以及使用的HTTP版本;紧接着是多行头部(headers)信息,用来说明服务器要使用的附加信息;头部信息之后是一个回车换行符(/r/n),用于标明头部信息的结束。以上是必须内容,根据需要可在头部信息结束之后增加主体数据(request-body);主体数据之后是一个回车换行符(/r/n),用于标明主体数据的结束。
需要注意的是
- 请求行(request-line)中的URL部分必须以application/x-www-form-urlencoded方式编码。
- 主体数据(request-body)的编码方式由头部(headers)信息中的Content-Type指定。
- 主体数据(request-body)的长度由头部(headers)信息中的Content-Length指定。
- 如果请求中需要附加主体数据,即增加request-body部分,则必须使用POST方式发送HTTP请求。
- HTML超链接(< a >< /a>)只能用GET方式提交HTTP请求,HTML表单(< form>< / form>)则可以使用GET和POST两种方式提交HTTP请求。
HTML表单使用方法
<form action="目标地址" method="发送方式" enctype="数据主体的编码方式">
<!-- 各类型的表单域 -->
<input name="NAME" value="VALUE"/>
<textarea name="NAME">VALUE</textarea>
<select name="NAME">
<option value="VALUE" selected="selected"/>
</select>
</form>
说明: 表单中存在各种类型的表单域标签,如、及。每一种表单域标签均有NAME与VALUE两种标签属性。这两个标签属性决定了表单提交时传送的属性名及相应的值。
发送方式
method标签属性指定了表单的发送方式,发送方式只有两种:GET及POST。
GET 方法
当以GET方式发送表单时,发送的HTTP请求没有request-body部分,所以不需要指定enctype标签属性。
GET方式只提交表单域中的数据,action标签属性中如果存在?子句,GET方式将不予处理。如下面的表单:
<form action="checkUser.html?opt=xxx" method="GET">
<input type="text" name="username" value="yyy"/>
<input type="text" name="age" value="zzz"/>
<input type="submit" value="submit"/>
</form>
说明: 以GET方式提交表单时,每个表单域的NAME与VALUE要以URL的方式提交,所以每个表单域的NAME与VALUE均要进行URL Encoding处理。这个操作通常是由用户端浏览器完成的。
对于GET方式,服务器端用Request.QueryString获取变量的值。
Private void Page_Load(object sender,System.EventArgs e)
{
//获取表单中用户名的数据
string userName=Request.QueryString["userName"].ToString();
}
POST 方法
当以POST方式发送表单时,表单域中的数据将作为request-body提交,action标签属性中的?子句将在request-line中得以保留。如下面的表单:
<form action="checkUser.html?opt=xxx" method="POST">
<input type="text" name="username" value="yyy"/>
<input type="text" name="age" value="zzz"/>
<input type="submit" value="submit"/>
</form>
说明: 以POST方式提交表单时,action标签属性的值必须是已经进行了URL Encoding处理之后的值,用户端浏览器不会自动处理URL中的非法字符。
如果表单中包含需要上传的文件数据,则在指定method=”POST”的同时还要指定enctype=”multipart/form-data”。如下面的表单:
<form action="checkUser.html?opt=xxx" method="POST"
enctype="multipart/form-data">
<input type="text" name="username" value="yyy"/>
<input type="text" name="age" value="zzz"/>
<input type="file" name="file" />
<inupt type="submit" value="submit"/>
</form>
对于POST方式,服务器端用Request.Form获取提交的数据。
Private void Page_Load(object sender,System.EventArgs e)
{
//获取表单中用户名的数据
string userName=Request.Form["userName"].ToString();
}
数据主体的编码方式
- 在HTTP请求中,request-line总是以application/x-www-form-urlencoded方式编码。enctype标签属性只对request-body起作用。也就是说只有在method=”POST”的情况下,设置enctype才起作用。
- 设置enctype标签属性后,在HTTP请求的头部(headers)信息中会多出一行Content-Type信息,并且request-body部分将会以Content-Type指定的MIME进行编码。这些操作都是由客户端浏览器自动完成的。
- 在没有指定enctype标签属性时,表单以默认的application/x-www-form-urlencoded方式对request-body进行编码。
如果表单域中的NAME或VALUE含有非法字符(如中文字符),客户端浏览器会自动对其进行URL Encoding处理。 - URL Encoding的处理方法如下:
- 字母数字字符 “a” 到 “z”、”A” 到 “Z” 和 “0” 到 “9” 保持不变。
- 特殊字符 “.”、”-“、”*” 和 “_” 保持不变。
- 空格字符 ” ” 转换为一个加号 “+”。
- 所有其他字符都是不安全的,因此首先使用一种编码机制将它们转换为一个或多个字节。然后对每个字节用一个包含 3 个字符的字符串 “%xy” 表示,其中 xy 为该字节的两位
- 十六进制表示形式。推荐的编码机制是 UTF-8。
GET与POST的区别
1、GET方式在request-line中传送数据;POST方式在request-line及request-body中均可以传送数据。
2、GET的主要任务是获得数据,但在获得数据前也可以向服务器提交一些数据; POST的主要任务是提交数据,但在提交数据之后服务器也会向用户端返回一些显示用的数据。
3、对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
4、get传送的数据量较小(最好是不修改服务器的数据)。post传送的数据量较大,一般被默认为不受限制。
5、从表象来看POST的安全性相比GET安全性要好一点。 如果没有加密措施,两者的安全级别都是一样的。用第三方工具都可以获取。