提交数据的各种方式form,curl ,sockt,file_get_contents

1、手动构造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头和数据内容,你可以接下来按需要进行处理分析.
}


2、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;
}

方法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;
}
?>


你可能感兴趣的:(PHP)