PHP模擬post提交數(shù)據(jù)方法匯總
使用php模擬post傳值雖然在日常生活中用到的不是很多,但是在某些場合還是經(jīng)常用到的。下面腳本之家小編給大家整理了三種php模擬post傳值的方法,file_get_contents、curl和socket。
第一種:file_get_contents來模擬post
<php function file_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 function curl_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 function socket_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 <span class="Apple-tab-span" style="white-space:pre"></span>POST {$urls[‘path‘]} HTTP/1.1 <span class="Apple-tab-span" style="white-space:pre"></span>Host:{$urls[‘host‘]} <span class="Apple-tab-span" style="white-space:pre"></span>Content-Type: application/x-www-form-urlencoded <span class="Apple-tab-span" style="white-space:pre"></span>Content-Length:{$length} <span class="Apple-tab-span" style="white-space:pre"></span>Connection: close <span class="Apple-tab-span" style="white-space:pre"></span>{$post} <span class="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的時候,發(fā)送header信息時必須要注意header的完整信息,比如content type和content length必須要有,connection: close和post數(shù)據(jù)之間要空一行,等等;而通過socket取得的內容是包含了header信息的,要處理一下才能獲得真正的內容。
下面給大家說下php模擬post提交請求,調用接口
/** * 模擬post進行url請求 * @param string $url * @param string $param */ function request_post($url = '', $param = '') { if (empty($url) || empty($param)) { return false; } $postUrl = $url; $curlPost = $param; $ch = curl_init();//初始化curl curl_setopt($ch, CURLOPT_URL,$postUrl);//抓取指定網(wǎng)頁 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; }
這是方法,
下面是具體的調用案例。
function testAction(){ $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_data as $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請求 * @param string $url * @param array $post_data */ function request_post($url = '', $post_data = array()) { if (empty($url) || empty($post_data)) { return false; } $o = ""; foreach ( $post_data as $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);//抓取指定網(wǎng)頁 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; }
將拼接也封裝了起來,這樣調用的時候就更簡潔了。
function testAction(){ $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); }
相關文章
Laravel5.1框架自帶權限控制系統(tǒng) ACL用法分析
這篇文章主要介紹了Laravel5.1框架自帶權限控制系統(tǒng) ACL用法,結合實例形式分析了laravel5.1相關的角色創(chuàng)建、權限分配等相關操作技巧,需要的朋友可以參考下2019-12-12PHP中使用socket方式GET、POST數(shù)據(jù)實例
這篇文章主要介紹了PHP中使用socket方式GET、POST數(shù)據(jù)實例,本文分別給出GET方式和POST方式的代碼實例,需要的朋友可以參考下2015-04-04完美實現(xiàn)wordpress禁止文章修訂和自動保存的方法
這篇文章主要介紹了完美實現(xiàn)wordpress禁止文章修訂和自動保存的方法,需要的朋友可以參考下2014-11-11php中session_id()函數(shù)詳細介紹,會話id生成過程及session id長度
這篇文章主要介紹了php中session_id()函數(shù)詳細介紹,會話id生成過程及session id長度的相關資料,需要的朋友可以參考下2015-09-09thinkPHP5使用laypage分頁插件實現(xiàn)列表分頁功能
這篇文章主要為大家詳細介紹了thinkPHP5使用laypage分頁插件實現(xiàn)列表分頁功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11PHP統(tǒng)計二維數(shù)組元素個數(shù)的方法
數(shù)據(jù)表里面的字段 content 存儲了一個以逗號分割的字符串,最大有20個數(shù),最大數(shù)字為40。比如3,24,33,40類似字樣的數(shù)字序列。其實就是一個保存了多項投票結果的字段啦。現(xiàn)在需要統(tǒng)計每個數(shù)字的個數(shù),也就是每個投票項有多少人投了,并排序2013-11-11