利用PHP实现http的get或post数据提交有多种方式,我们可以根据不同的环境来选择不同的实现,下面就简单介绍一下利用PHP实现http数据提交的几种方式.
header函数重定向实现http数据提交
这种方式简单易行,但也有弊端,就是在执行header()函数之前不能有任何输出(不过这种方式我们可以使用php缓冲输出函数进行控制),既然已经重 定向了,那我们就无法返回到我们刚才的页面,也无法控制它的执行流程,如果对于这方面没有什么要求的话,我们就可以直接使用header()函数来进行参 数提交.
下面是一个简单例子:
header("Location:http://www.hongxincao.com/login.php?username=admin&password=password");
手动构造http数据包实现http数据提交
这种方式一般不建议使用,除非是特别要求或必须应用时再使用,手动构造的http头数据的方式比较麻烦,而且实现起来代码也比较多.我只有在利用其他方式 实在无法实现的情况下才使用这种提交方式,不过我们可以先利用网络数据抓包工具抓取到提交的http头和数据内容,然后我们直接根据其进行构造即可.
其基本流程就是使用fsockopen函数连接到要提交的服务器,然后我们手动构造http头及提交的数据,利用fputs和fgets函数来进行数据的提交并获取到返回数据.
下面是一个简单的样例函数,可以参考一下.
function auth_user_info($url,$host,$port,$tokenid,$appid) {
$str_var = '这里是要POST提交的数据';
//sockopen连接80端口进行提交
$fp = fsockopen($host, $port, &$errno, &$errstr, $timeout);
if ( $fp == false ) {
return false;
}
//下面是提交的http头内容,你修改为对应的内容即可
fputs($fp, "POST $url HTTP/1.0/r/n");
fputs($fp, "Accept-Encoding: gzip,deflate/r/n");
fputs($fp, "Content-Type: application/x-www-form-urlencoded/r/n");
fputs($fp, "SOAPAction: /r/n");
fputs($fp, "User-Agent: Jakarta Commons-HttpClient/3.1/r/n");
fputs($fp, "Host: $host/r/n");
fputs($fp, "Content-Length: ".strlen($str_var)."/r/n");
fputs($fp, "/r/n");
fputs($fp, "$str_var/r/n");
while( $line = fgets($fp, 4096) ) {
if ( $h == true && ($line == "/r" || $line == "/n" || $line == "/r/n"
|| $line == "/n/r") ) {
$h = false;
} else if ( $h == true ) {
$head .= $line;
} else {
$body .= $line;
}
}
//$body里面保存的就是http返回的数据,包括http头和数据内容,你可以接下来按需要进行处理分析.
}
php的curl函数库实现http数据提交
在我看来,这应该是最方便且功能强大的实现方式了,curl库函数库的功能十分强大,它支持 FTP,FTPS,HTTP,HTTPS,SCP,SFTP,TFTP,LDAP等多种网络协议,支持SSL证书,HTTP POST,HTTP PUT,FTP上传,基于HTTP格式的上传,代理,Cookie,用户+口令验证,文件传输恢复,HTTP代理通道和大量有用的技巧,关于curl函数 的说明在这里不可能一下子全部说完,稍后我会整理一篇关于curl函数的说明或者大家在网络上一搜就全部出来了.
curl函数对做网站采集的朋友来说也是福音,如果你能掌握curl库函数的相关使用,那你绝对能够成为一个采集数据的高手,而且是高手中的高手,由此可见其强大之处了.
下面是几个简单样例函数:
//该函数用于返回http提交后返回的数据
function getip($web,$data)
{
$ch = curl_init();
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_URL,$web);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
ob_start();
curl_exec($ch);
$res = ob_get_contents();
ob_end_clean();
return $res;
}
//该函数只是用于验证http提交十分正常,返回数据十分正确
function curl_send($data)
{
global $URL_HOME;
$url = "/action";
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$URL_HOME.$url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_HEADER,true);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$head = curl_exec($ch);
curl_close($ch);
$head = split("(/r|/n)+", $head);
while( list($k, $v) = each($head) ) {
if ( preg_match("/^HTTP//1/.(0|1) ([0-9]+)/", $v, $m ) ) {
$http_code = $m[2];
}
else if ( preg_match("/^code: (.+)/", $v, $m ) ) {
$code = $m[1];
}
else if ( preg_match("/^str: (.+)/", $v, $m ) ) {
$str = $m[1];
}
}
return $code;
}
原创文章,转载请注明来源: 红心草博客
原文地址: http://www.hongxincao.com/archives/170.html
后记
关于php进行http数据提交的内容就简单介绍到这里,如果有朋友感兴趣或有什么更好的方式都可以给我留言,我们共同探讨和学习.