PHP强化之15 - get与post
一、简介
在HTTP协议下,输入输出的原型其实是HTTP请求与响应,客户端向服务器端发送的数据称之为请求,反之称为响应。虽然HTTP/1.1定义了7种请求方法,但是最常用的却只有在HTTP/0.9种就已经有的两种方法——GET和POST,它们都允许发送自定义数据给服务器端。因此,可以通过接收这两种方法的请求数据,来实现输入。
二、GET
GET是HTTP中最原始的请求方式,在网页中点击一个超级链接或在地址栏输入一个URL都会发送一个GET请求。在GET请求中,数据是后缀在URL后面来发送的,就好像这样:http://www.xxx.com/request.php?name=nosee123
。
大部分被传输到浏览器的html,images,js,css, … 都是通过GET方法发出请求的。它是获取数据的主要方法。
get提交方式属于显式提交,也就是我们提交信息时,所提交的数据会显示在url中,那么我们提交的数据是可以被用户查看到的,当然这些信息都是一些不重要的东西。
1、get请求方式
1)表单提交get
如果不指定Method,默认也是GET请求,Form中提交的数据将会附加在url之后,以?分开与url分开。
<form action = "test.php" method = "get">
<input type="text" name = 'name' value = 'nosee123'/>
<input type= 'submit' />
<input type= 'reeset' />
</form>
2)a链接形式
<a herf="test.php?name=nosee123">这是个链接</a>
3)用file_get_contents 以get方式获取内容
$url='//www.jb51.net/';
$html = file_get_contents($url);
echo $html;
4)用fopen打开url, 以get方式获取内容:
$fp = fopen($url, 'r');
stream_get_meta_data($fp);
while(!feof($fp)) {
$result .= fgets($fp, 1024);
}
echo "url body: $result";
fclose($fp);
2、注意:
当使用GET方法发送数据时,则 <form>标签 action 属性值中不能包含查询字符串(即使包含也不会生效)
即:
<form action="post.php?act=login" method="get">
... ...
</form>
应该改为:
<form action="post.php" method="get">
... ...
<input type="hidden" name="act" value="login">
</form>
三、POST
GET方法的本意就是下载(与其对应的是上传方法PUT),因此并不是专门用于传递数据的,它将请求数据全部经过URL编码后缀在请求资源的后面,这样一来,当数据很多时URL就会变得很长——但这并不是问题的所在,问题所在是一些WEB浏览器或服务器程序会限制这行字符串的长度。这时,就需要用到POST方法了。
顾名思义,POST方法的主要用途就是“传递”数据,它将数据放在所有请求标题的后面上传,这样一来,无论有多少数据上传都不成问题了(这样请求数据的大小之取决于WEB服务允许的尺寸了)。通常来说,对于表单数据如无特别需要都使用POST方法来上传,这样就无须去关心具体上传数据的尺寸了。
1、post请求方式
1)表单提交post
2)用file_get_contents函数,以post方式获取url
$data = array ('foo' => 'bar');
$data = http_build_query($data);
$opts = array (
'http' => array (
'method' => 'POST',
'header'=> "Content-type: application/x-www-form-urlencodedrn" .
"Content-Length: " . strlen($data) . "\r\n",
'content' => $data
)
);
$context = stream_context_create($opts);
$html = file_get_contents('http://localhost/e/admin/test.html', false, $context);
echo $html;
3)使用curl库模拟post或get请求
$url = "http://nosee123.com/test_post.php";
$post_data = array (
"name" => "nosee",
"url" => "http://www.nosee123.com",
"action" => "Submit"
);
$ch = curl_init($url );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_POST, 1); // 设置请求为post类型
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); // 添加post数据到请求中
$str = curl_exec($ch); // 执行post请求,获得回复
curl_close($ch);
echo $str ; //查看执行结果
2、注意:
在默认的情况下,post提交的信息最多不会超过8m,当然我们也可以在php.ini中设置post_max_size值来进行更改
四、GET与POST的区别
1)post发送的数据量更大(get有url长度限制);所以上传文件时只能用post方式。
get传输的数据量小(一般认为不能大于2KB,因为受URL长度限制),但效率较高
2)get请求无消息体,只能携带少量数据
post请求有消息体,可以携带大量数据
3)get限制form表单的数据集的值必须为ascii字符;而post支持更多的数据集(整个iso10646字符集)。
get限制Form表单的数据集的值必须为ASCII字符,不能通过request.setCharacterEncoding("utf-8")
设置中文字符,服务器得到的中文字符可能为乱码!post支持整个字符集ISO10646,可以通request.setCharacterEncoding("utf-8")
正确显示中文字符。
4)Get主要用于页面搜索,而Post用于数据的增、删、改。
5)POST方法的请求数据被封装到了$_POST数组中,而GET方法的请求数据则被封装到$_GET数组。
五、其它请求方式
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
1、HEAD:获得报文首部
HEAD方法和GET方法一样,只是不返回报文的主体部分,用于确认URI的有效性及资源更新的日期时间等。
具体来说:1、判断类型; 2、查看响应中的状态码,看对象是否存在(响应:请求执行成功了,但无数据返回); 3、测试资源是否被修改过
HEAD方法和GET方法的区别: GET方法有实体,HEAD方法无实体。
2、PUT:传输文件
PUT方法用来传输文件,就像FTP协议的文件上传一样,要求在请求报文的主体中包含文件内容,然后保存在请求URI指定的位置。但是HTTP/1.1的PUT方法自身不带验证机制,任何人都可以上传文件,存在安全问题,故一般不用。
3、DELETE:删除文件
指明客户端想让服务器删除某个资源,与PUT方法相反,按URI删除指定资源
4、OPTIONS:询问支持的方法
OPTIONS方法用来查询针对请求URI指定资源支持的方法(客户端询问服务器可以提交哪些请求方法)
5、TRACE:追踪路径
客户端可以对请求消息的传输路径进行追踪,TRACE方法是让Web服务器端将之前的请求通信还给客户端的方法
6、CONNECT:要求用隧道协议连接代理
CONNECT方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL(安全套接层)和TLS(传输层安全)协议把通信内容加密后经网络隧道传输。
《THE END》