zl程序教程

您现在的位置是:首页 >  其他

当前栏目

使用PHPSocket编程模拟Httppost和get请求

模拟编程 使用 请求 get phpsocket
2023-06-13 09:15:31 时间

这里给大家分享一段使用PHPSocket编程模拟Httppost和get请求的代码,非常的实用,结尾部分我们再讨论下php模拟http请求的几种方法。

复制代码代码如下:


<?php/**
 *使用PHPSocket编程模拟Httppost和get请求
 *@authorkoma
 */classHttp{
   private$sp="\r\n";//这里必须要写成双引号    private$protocol="HTTP/1.1";
   private$requestLine="";
   private$requestHeader="";
   private$requestBody="";
   private$requestInfo="";
   private$fp=null;
   private$urlinfo=null;
   private$header=array();
   private$body="";
   private$responseInfo="";
   privatestatic$http=null;//Http对象单例    
   privatefunction__construct(){}
   publicstaticfunctioncreate(){
       if(self::$http===null){ 
           self::$http=newHttp();
       }
       returnself::$http;
   }
   publicfunctioninit($url){
       $this->parseurl($url);
       $this->header["Host"]=$this->urlinfo["host"];
       return$this;
   }
   publicfunctionget($header=array()){
       $this->header=array_merge($this->header,$header);
       return$this->request("GET");
   }
   publicfunctionpost($header=array(),$body=array()){
       $this->header=array_merge($this->header,$header);
       if(!empty($body)){
           $this->body=http_build_query($body);
           $this->header["Content-Type"]="application/x-www-form-urlencoded";
           $this->header["Content-Length"]=strlen($this->body);
       }
       return$this->request("POST");
   }
   privatefunctionrequest($method){
       $header="";
       $this->requestLine=$method."".$this->urlinfo["path"]."?".$this->urlinfo["query"]."".$this->protocol;
       foreach($this->headeras$key=>$value){
           $header.=$header==""?$key.":".$value:$this->sp.$key.":".$value;
       }
       $this->requestHeader=$header.$this->sp.$this->sp;
       $this->requestInfo=$this->requestLine.$this->sp.$this->requestHeader;
       if($this->body!=""){
           $this->requestInfo.=$this->body;
       }
       /*
        *注意:这里的fsockopen中的url参数形式为"www.xxx.com"
        *不能够带"http://"这种
        */
       $port=isset($this->urlinfo["port"])?isset($this->urlinfo["port"]):"80";
       $this->fp=fsockopen($this->urlinfo["host"],$port,$errno,$errstr);
       if(!$this->fp){
           echo$errstr."(".$errno.")";
           returnfalse;
       }
       if(fwrite($this->fp,$this->requestInfo)){
           $str="";
           while(!feof($this->fp)){
               $str.=fread($this->fp,1024);
           }
           $this->responseInfo=$str;
       }
       fclose($this->fp);
       return$this->responseInfo;
   }
   privatefunctionparseurl($url){
       $this->urlinfo=parse_url($url);
   }
}//$url="http://news.163.com/14/1102/01/AA0PFA7Q00014AED.html";
$url="http://localhost/httppro/post.php";$http=Http::create()->init($url);/*发送get请求 
echo$http->get(array(
   "User-Agent"=>"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/35.0.1916.153Safari/537.36",
));
*/
 /*发送post请求*/echo$http->post(array(
       "User-Agent"=>"Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/35.0.1916.153Safari/537.36",
),array("username"=>"发一个中文","age"=>22));

php模拟http请求

方法一:利用php的socket编程来直接给接口发送数据来模拟post的操作。

建立两个文件post.php,getpost.php
post.php内容如下:

复制代码代码如下:


<?php
 $flag=0;
 $params="";
 $errno="";
 $errstr="";
 //要post的数据
$argv=array(
   "var1"=>"abc",
   "var2"=>"howareyou,myfriend??");
//构造要post的字符串
foreach($argvas$key=>$value){
   if($flag!=0){
       $params.="&";
       $flag=1;
   }
   $params.=$key."=";$params.=urlencode($value);
   $flag=1;
   }
   $length=strlen($params);
    //创建socket连接
   $fp=fsockopen("localhost",81,$errno,$errstr,10)orexit($errstr."--->".$errno);
   //构造post请求的头
   $header ="POST/flandy/getpost.phpHTTP/1.1\r\n";
   $header.="Host:127.0.0.1\r\n";
   $header.="Referer:/flandy/post.php\r\n";
   $header.="Content-Type:application/x-www-form-urlencoded\r\n";
   $header.="Content-Length:".$length."\r\n";
   $header.="Connection:Close\r\n\r\n";
   //添加post的字符串
   $header.=$params."\r\n";
   

   //发送post的数据
   fputs($fp,$header);
   $inheader=1;
   while(!feof($fp)){
       $line=fgets($fp,1024);//去除请求包的头只显示页面的返回数据
       if($inheader&&($line=="\n"||$line=="\r\n")){
            $inheader=0;
       }
       if($inheader==0){
         echo$line;
       }
   }

fclose($fp);
?>

getpost.php的内容如下

复制代码代码如下:
<?php
echo"thisisthedataposted";
echo"<pre>";
print_r($_REQUEST);
echo"</pre>";
?>

结果输出:

复制代码代码如下:
thisisthedatapostedArray
(
[var1]=>abc
[var2]=>howareyou,myfriend??
)

以上代码在本机81端口下已经通过测试。

方法二:

使用PHP的curl扩展或HttpClient.class.php类,这两个非常类似,下面简单的列出curl的实现代码。
两个文件post2.php和getpost2.php
post2.php的内容如下:

复制代码代码如下:
<?php
$psecode="NDE005";
$website="www.baidu.com";
$amt=1;
$pwd=123456;
$ch=curl_init();
$curl_url="http://localhost:81/flandy/getpost2.php?web=".$website.
"&pwd=".$pwd."&action=check&pseid=".$psecode.
"&amt=".$amt;
curl_setopt($ch,CURLOPT_URL,$curl_url);
curl_setopt($ch,CURLOPT_POST,1);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//不直接输出,返回到变量
$curl_result=curl_exec($ch);
$result=explode(",",$curl_result);
curl_close($ch);
print_r($result);
?>

getpost2.php的内容如下:

复制代码代码如下:
<?php
echo"returndata<br>";
echo"<pre>";
print_r($_REQUEST);
echo"</pre>";
?>

结果输出:

复制代码代码如下:
Array([0]=>returndataArray
(
[web]=>"wwwbaiducom"
[pwd]=>123456
[action]=>check
[pseid]=>"NDE005"
[amt]=>1
)
)

方法三:

这个要借助第三方类库HttpClient可以到这里下载:http://scripts.incutio.com/httpclient/

复制代码代码如下:
<?php
require_once"HttpClient.class.php";
$params=array("web"=>"www.baidu.com",
"pwd"=>"123456",
"action"=>"check",
"pseid"=>"NDE005",
"amt"=>1);
$pageContents=HttpClient::quickPost("http://localhost:81/flandy/getpost3.php",$params);
$result=explode(",",$pageContents);
print_r($result);
?>