使用PHPSocket编程模拟Httppost和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);
?>
getpost.php的内容如下
结果输出: 以上代码在本机81端口下已经通过测试。 方法二: 使用PHP的curl扩展或HttpClient.class.php类,这两个非常类似,下面简单的列出curl的实现代码。 getpost2.php的内容如下: 结果输出: 方法三: 这个要借助第三方类库HttpClient可以到这里下载:http://scripts.incutio.com/httpclient/
<?php
echo"thisisthedataposted";
echo"<pre>";
print_r($_REQUEST);
echo"</pre>";
?>
thisisthedatapostedArray
(
[var1]=>abc
[var2]=>howareyou,myfriend??
)
两个文件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);
?>
<?php
echo"returndata<br>";
echo"<pre>";
print_r($_REQUEST);
echo"</pre>";
?>
Array([0]=>returndataArray
(
[web]=>"wwwbaiducom"
[pwd]=>123456
[action]=>check
[pseid]=>"NDE005"
[amt]=>1
)
)
<?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);
?>
相关文章