PHP類比post提交資料方法匯總_php執行個體

來源:互聯網
上載者:User

使用php類比post傳值雖然在日常生活中用到的不是很多,但是在某些場合還是經常用到的。下面雲棲社區小編給大家整理了三種php類比post傳值的方法,file_get_contents、curl和socket。

第一種:file_get_contents來類比post

<phpfunction 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

<phpfunction 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

<phpfunction 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的時候,發送header資訊時必須要注意header的完整資訊,比如content type和content length必須要有,connection: close和post資料之間要空一行,等等;而通過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();//初始化curlcurl_setopt($ch, CURLOPT_URL,$postUrl);//抓取指定網頁curl_setopt($ch, CURLOPT_HEADER, 0);//設定headercurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求結果為字串且輸出到螢幕上curl_setopt($ch, CURLOPT_POST, 1);//post提交方式curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);$data = curl_exec($ch);//運行curlcurl_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();//初始化curlcurl_setopt($ch, CURLOPT_URL,$postUrl);//抓取指定網頁curl_setopt($ch, CURLOPT_HEADER, 0);//設定headercurl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求結果為字串且輸出到螢幕上curl_setopt($ch, CURLOPT_POST, 1);//post提交方式curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);$data = curl_exec($ch);//運行curlcurl_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);}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.