这种方式一般不建议使用,除非是特别要求或必须应用时再使用,手动构造的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头和数据内容,你可以接下来按需要进行处理分析. }
在我看来,这应该是最方便且功能强大的实现方式了,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; }
方法1: 用file_get_contents 以get方式获取内容
复制代码代码如下:
<?php
$url='http://www.domain.com/';
$html = file_get_contents($url);
echo $html;
?>
方法2: 用fopen打开url, 以get方式获取内容
复制代码代码如下:
<?php
$fp = fopen($url, 'r');
stream_get_meta_data($fp);
while(!feof($fp)) {
$result .= fgets($fp, 1024);
}
echo "url body: $result";
fclose($fp);
?>
方法3:用file_get_contents函数,以post方式获取url
复制代码代码如下:
<?php
$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) . "rn",
'content' => $data
)
);
$context = stream_context_create($opts);
$html = file_get_contents('http://localhost/e/admin/test.html', false, $context);
echo $html;
?>
方法4:用fsockopen函数打开url,以get方式获取完整的数据,包括header和body
复制代码代码如下:
<?php
function get_url ($url,$cookie=false)
{
$url = parse_url($url);
$query = $url[path]."?".$url[query];
echo "Query:".$query;
$fp = fsockopen( $url[host], $url[port]?$url[port]:80 , $errno, $errstr, 30);
if (!$fp) {
return false;
} else {
$request = "GET $query HTTP/1.1rn";
$request .= "Host: $url[host]rn";
$request .= "Connection: Closern";
if($cookie) $request.="Cookie: $cookien";
$request.="rn";
fwrite($fp,$request);
while()) {
$result .= @fgets($fp, 1024);
}
fclose($fp);
return $result;
}
}
//获取url的html部分,去掉header
function GetUrlHTML($url,$cookie=false)
{
$rowdata = get_url($url,$cookie);
if($rowdata)
{
$body= stristr($rowdata,"rnrn");
$body=substr($body,4,strlen($body));
return $body;
}
return false;
}
?>