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); }