PHP模拟post提交数据方法汇总
使用php模拟post传值虽然在日常生活中用到的不是很多,但是在某些场合还是经常用到的。下面毛票票小编给大家整理了三种php模拟post传值的方法,file_get_contents、curl和socket。
第一种:file_get_contents来模拟post
<php
functionfile_get_contents_post($url,$post){
$options=array(
‘http‘=>array(
‘method‘=>‘POST‘,
‘content‘=>http_build_query($post),
),
);
$result=file_get_contents($url,false,stream_context_create($options));
return$result;
}
$data=file_get_contents_post("http://www.a.com/post/post.php",array(‘name‘=>‘caiknife‘,‘email‘=>‘caiknife#gmail.com‘));
var_dump($data);
第二种:curl模拟post
<php
functioncurl_post($url,$post){
$options=array(
CURLOPT_RETURNTRANSFER=>true,
CURLOPT_HEADER=>false,
CURLOPT_POST=>true,
CURLOPT_POSTFIELDS=>$post,
);
$ch=curl_init($url);
curl_setopt_array($ch,$options);
$result=curl_exec($ch);
curl_close($ch);
return$result;
}
$data=curl_post("http://www.a.com/post/post.php",array(‘name‘=>‘caiknife‘,‘email‘=>‘caiknife#gmail.com‘));
var_dump($data);
第三种:socket来模拟post
<php
functionsocket_post($url,$post){
$urls=parse_url($url);
if(!isset($urls[‘port‘])){
$urls[‘port‘]=80;
}
$fp=fsockopen($urls[‘host‘],$urls[‘port‘],$errno,$errstr);
if(!$fp){
echo"$errno,$errstr";
exit();
}
$post=http_build_query($post);
$length=strlen($post);
$header=<<<HEADER
<spanclass="Apple-tab-span"style="white-space:pre"></span>POST{$urls[‘path‘]}HTTP/1.1
<spanclass="Apple-tab-span"style="white-space:pre"></span>Host:{$urls[‘host‘]}
<spanclass="Apple-tab-span"style="white-space:pre"></span>Content-Type:application/x-www-form-urlencoded
<spanclass="Apple-tab-span"style="white-space:pre"></span>Content-Length:{$length}
<spanclass="Apple-tab-span"style="white-space:pre"></span>Connection:close
<spanclass="Apple-tab-span"style="white-space:pre"></span>{$post}
<spanclass="Apple-tab-span"style="white-space:pre"></span>HEADER;
fwrite($fp,$header);
$result=‘‘;
while(!feof($fp)){
$result.=fread($fp,512);
}
$result=explode("\r\n\r\n",$result,2);
return$result[1];
}
$data=socket_post("http://www.a.com/post/post.php",array(‘name‘=>‘caiknife‘,‘email‘=>‘caiknife#gmail.com‘));
var_dump($data);
上面这三种方法最后看到的内容都是一样的,都可以得到post的传值;但是在是用socket的时候,发送header信息时必须要注意header的完整信息,比如contenttype和contentlength必须要有,connection:close和post数据之间要空一行,等等;而通过socket取得的内容是包含了header信息的,要处理一下才能获得真正的内容。
下面给大家说下php模拟post提交请求,调用接口
/**
*模拟post进行url请求
*@paramstring$url
*@paramstring$param
*/
functionrequest_post($url='',$param=''){
if(empty($url)||empty($param)){
returnfalse;
}
$postUrl=$url;
$curlPost=$param;
$ch=curl_init();//初始化curl
curl_setopt($ch,CURLOPT_URL,$postUrl);//抓取指定网页
curl_setopt($ch,CURLOPT_HEADER,0);//设置header
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//要求结果为字符串且输出到屏幕上
curl_setopt($ch,CURLOPT_POST,1);//post提交方式
curl_setopt($ch,CURLOPT_POSTFIELDS,$curlPost);
$data=curl_exec($ch);//运行curl
curl_close($ch);
return$data;
}
这是方法,
下面是具体的调用案例。
functiontestAction(){
$url='http://mobile.jschina.com.cn/jschina/register.php';
$post_data['appid']='10';
$post_data['appkey']='cmbohpffXVR03nIpkkQXaAA1Vf5nO4nQ';
$post_data['member_name']='zsjs123';
$post_data['password']='123456';
$post_data['email']='zsjs123@126.com';
$o="";
foreach($post_dataas$k=>$v)
{
$o.="$k=".urlencode($v)."&";
}
$post_data=substr($o,0,-1);
$res=$this->request_post($url,$post_data);
print_r($res);
}
这样就提交请求,并且获取请求结果了。一般返回的结果是json格式的。
这里的post是拼接出来的。
也可以改造成下面的方式。
/**
*模拟post进行url请求
*@paramstring$url
*@paramarray$post_data
*/
functionrequest_post($url='',$post_data=array()){
if(empty($url)||empty($post_data)){
returnfalse;
}
$o="";
foreach($post_dataas$k=>$v)
{
$o.="$k=".urlencode($v)."&";
}
$post_data=substr($o,0,-1);
$postUrl=$url;
$curlPost=$post_data;
$ch=curl_init();//初始化curl
curl_setopt($ch,CURLOPT_URL,$postUrl);//抓取指定网页
curl_setopt($ch,CURLOPT_HEADER,0);//设置header
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);//要求结果为字符串且输出到屏幕上
curl_setopt($ch,CURLOPT_POST,1);//post提交方式
curl_setopt($ch,CURLOPT_POSTFIELDS,$curlPost);
$data=curl_exec($ch);//运行curl
curl_close($ch);
return$data;
}
将拼接也封装了起来,这样调用的时候就更简洁了。
functiontestAction(){
$url='http://mobile.jschina.com.cn/jschina/register.php';
$post_data['appid']='10';
$post_data['appkey']='cmbohpffXVR03nIpkkQXaAA1Vf5nO4nQ';
$post_data['member_name']='zsjs124';
$post_data['password']='123456';
$post_data['email']='zsjs124@126.com';
//$post_data=array();
$res=$this->request_post($url,$post_data);
print_r($res);
}