使用PHP Socket 编程模拟Http post和get请求
这里给大家分享一段使用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); ?>