PHP中採用POST方式發送資料

來源:互聯網
上載者:User

最近兩天項目需要,由於伺服器正在開發,用戶端進度稍快一些,沒有伺服器進行聯調。因此我重操舊業,用PHP快速的寫了一些web頁面,算是當測試樁程式了,七八個web介面,基本上5到6個小時搞定了。由於當前的伺服器需要與其他伺服器進行對接,因此寫的這個web服務還需要充當client角色,向其他伺服器發送請求。

在網上搜了一下,基本上兩種方法:(轉自網友文章)

1.通過curl函數 $post_data = array () ;
$post_data [ ' clientname ' ] = " test08 " ;
$post_data [ ' clientpasswd ' ] = " test08 " ;
$post_data [ ' submit ' ] = " submit " ;
$url = ' http://xxx.xxx.xxx.xx/xx/xxx/top.php ' ;
$o = "" ;
foreach ( $post_data as $k => $v )
{
     $o .= " $k = " . urlencode ( $v ) . " & " ;
}
$post_data = substr ( $o , 0 ,- 1 ) ;
$ch = curl_init () ;
curl_setopt ( $ch , CURLOPT_POST , 1 ) ;
curl_setopt ( $ch , CURLOPT_HEADER , 0 ) ;
curl_setopt ( $ch , CURLOPT_URL , $url ) ;
//為了支援cookie
curl_setopt ( $ch , CURLOPT_COOKIEJAR , ' cookie.txt ' ) ;
curl_setopt ( $ch , CURLOPT_POSTFIELDS , $post_data ) ;
$result = curl_exec ( $ch ) ;
2. 通過fsockopen $URL =‘ http : //xxx.xxx.xxx.xx/xx/xxx/top.php';
$post_data [ ' clientname ' ] = " test08 " ;
$post_data [ ' clientpasswd ' ] = " test08 " ;
$post_data [ ' submit ' ] = " ログイン " ;
$referrer = "" ;
// parsing the given URL
$URL_Info = parse_url ( $URL ) ;
// Building referrer
if ( $referrer == "" ) // if not given use this script as referrer
$referrer = $_SERVER [ " SCRIPT_URI " ] ;
 
// making string from $data
foreach ( $post_data as $key => $value )
$values [] = " $key = " . urlencode ( $value ) ;
 
$data_string = implode ( " & " , $values ) ;
// Find out which port is needed - if not given use standard (=80)
if ( ! isset ( $URL_Info [ " port " ]))
$URL_Info [ " port " ] = 80 ;
// building POST-request:
$request .= " POST " . $URL_Info [ " path " ] . " HTTP/1.1 /n " ;
$request .= " Host: " . $URL_Info [ " host " ] . " /n " ;
$request .= " Referer: $referrer /n " ;
$request .= " Content-type: application/x-www-form-urlencoded /n " ;
$request .= " Content-length: " . strlen ( $data_string ) . " /n " ;
$request .= " Connection: close /n " ;
$request .= " /n " ;
$request .= $data_string . " /n " ;
$fp = fsockopen ( $URL_Info [ " host " ] , $URL_Info [ " port " ]) ;
fputs ( $fp , $request ) ;
while ( ! feof ( $fp )) {
     $result .= fgets ( $fp , 128 ) ;
}
fclose ( $fp ) ;
上述兩種方法沒有封裝成通用的function,我驗證了方法2,發現基本上能實現功能,但有兩個很大的缺點: 1. 延遲比較大,我在內網測試,用命令列進行的測試,發現響應有時候需要2S以上,不能接受。 2. 讀到的response包含了HTTP頭域資訊,但是大部分情況下,我們只需要body部分內容,要提取body內容,還需要一番處理。 方法1感覺也很笨拙,似乎也很難滿足我的需求,最後忘記在哪個英文網站上找到了下面這個方法:   function do_post_request($url, $data, $optional_headers = null)
  {
     $params = array('http' => array(
                  'method' => 'POST',
                  'content' => $data
               ));
     if ($optional_headers !== null) {
        $params['http']['header'] = $optional_headers;
     }
     $ctx = stream_context_create($params);
     $fp = @fopen($url, 'rb', false, $ctx);
     if (!$fp) {
        throw new Exception("Problem with $url, $php_errormsg");
     }
     $response = @stream_get_contents($fp);
     if ($response === false) {
        throw new Exception("Problem reading data from $url, $php_errormsg");
     }
     return $response;
  }
試用了一下,感覺效果非常好,簡潔,通用,而且返回的內容僅僅是Body中內容。我也沒去仔細研究這些API的說明,就採用了這個,沒發現有大的問題。如果有人有類似需求,推薦大家採用這個function.

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.