摘要:使用發起請求時,我們會常用方法,具體的請求方式可以參考請求詳解這篇文章。但我推薦,為了請求的規范化,應該全部使用對請求的參數進行編碼。
使用PHP發起請求時,我們會常用cURL方法,具體的PHP請求方式可以參考 PHP cURL請求詳解 這篇文章。
cURL發起POST請求在使用中,如果你需要發送POST的請求,需要配置CURLOPT_POST和CURLOPT_POSTFIELDS兩個參數,curl請求封裝后的源碼如下:
/** * 使用cURL方法獲取接口數據 * @param $uri 請求的url * @param $param 發起POST請求時攜帶的參數 * @return array 請求返回的數據,解析成json格式 */ public function fetchApi($uri, $param = array()) { // 初始化curl $ch = curl_init($uri); curl_setopt_array($ch, array( // 不直接輸出,返回到變量 CURLOPT_RETURNTRANSFER => true, // 設置超時為60s,防止機器被大量超時請求卡死 CURLOPT_TIMEOUT => 60 )); // 支持POST請求 if (!empty($param)) { curl_setopt_array($ch, array( CURLOPT_POST => true, // 設置POST參數 CURLOPT_POSTFIELDS => http_build_query($param) )); } // 請求數據 $data = curl_exec($ch); // 關閉請求 curl_close($ch); // 對數據進行編碼,方便前后端數據處理 return json_decode($data); }POST參數
如果需要使用POST方法,你需要設置CURLOPT_POST參數為true,并在CURLOPT_POSTFIELDS中傳遞post參數。
為什么使用http_build_query需要注意的是CURLOPT_POSTFIELDS參數只支持一維數組參數,否則會出錯,你可以本地測試:
為了測試這個功能,我們需要將上面的代碼做一處修改:
替換行CURLOPT_POSTFIELDS => http_build_query($param)
為:CURLOPT_POSTFIELDS => $param
// 測試發起多維數組的curl請求 public function actionTest() { $url = "www.baidu.com"; // 此處為二維關聯數組 $param = array("foo" => ["bar" => "cow"]); $data = $this->fetchApi($url, $param); echo json_encode($data); return $data; } // 結果會報錯:Array to string conversion
報錯信息如下圖:
如果我們需要避免這種多維數組的問題,就需要使用http_build_query方法:
函數聲明:
/** 函數作用:根據數組生成URL-encode之后的請求字符串 @param $query_data 可以是數組或包含public屬性的對象 @param $numeric_prefix 如果數組是數字下標,會使用該值作為數字下標前綴 @param $arg_separator 參數分割符,默認為& @param $enc_type URL編碼規范 @return string URL編碼后的字符串 */ string http_build_query ( mixed $query_data [, string $numeric_prefix [, string $arg_separator [, int $enc_type = PHP_QUERY_RFC1738 ]]] )
實例獲取數據:
// 一維數組 $data = array("foo", "bar", "baz", "boom", "cow" => "milk", "php" =>"hypertext processor"); echo http_build_query($data) . " "; echo http_build_query($data, "myvar_"); // 結果: // 0=foo&1=bar&2=baz&3=boom&cow=milk&php=hypertext+processor // myvar_0=foo&myvar_1=bar&myvar_2=baz&myvar_3=boom&cow=milk&php=hypertext+processor // 多維數組 $param = array("foo" => ["bar" => "cow"]); echo http_build_query($data); // 結果:foo%5Bbar%5D=cow 即:foo[bar]=cow結論:
curl請求的POSTOPT_FIELDS只支持一維數組,如果是多維數組,需要使用http_build_query方法。但我推薦,為了請求的url規范化,應該全部使用http_build_query對POST請求的參數進行編碼。
參考資料PHP手冊 CRULOPT參數:http://php.net/manual/zh/func...
PHP手冊 http_build_query: http://php.net/manual/zh/func...
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28728.html
摘要:不支持多進程,如果需要異步請求,非阻塞的方式,請選擇。時會發送請求,類型為,是表單提交時最常見的一種。允許函數執行的最長秒數。設定請求中部分的內容。常規的使用來請求,功能強大,使用方便,按需配置。 在PHP后端的開發過程中,除了獲取數據庫的數據和處理數據的內部邏輯,往往還需要請求其他服務器接口的數據,我們一般有3種方式來獲取數據,分別是: file_get_contents fsoc...
摘要:最近做的一個需求,要通過調用,以格式上傳文件。傳統上,的支持通過在數組數據中,使用文件全路徑的語法附加文件,供讀取上傳。的默認值為,的默認值為。對于而言,手動設置為是毫無意義的。命名空間或以下的版本沒有命名空間。 最近做的一個需求,要通過PHP調用cURL,以multipart/form-data格式上傳文件。踩坑若干,夠一篇文章了。 重要警告 沒事不要讀PHP的官方中文文檔!版本...
摘要:參見請求分析推測可能是對方服務器不接受這樣的吧或者對的不兼容 服務端常見的post提交有三種方式,這里主要記錄curl方式 1、服務端進行http-post的三種方法 1.1 通過curl函數 function post($url, $post_data = , $timeout = 5){//curl $ch = curl_init(); curl_setopt (...
摘要:發送接受是個可以訪問請求的原始數據的只讀流。在之前打開的數據流只能讀取一次數據流不支持操作。不過,依賴于的實現,請求體數據被保存的時候,它可以打開另一個數據流并重新讀取。 現在微服務中,很多API由于需要傳遞的參數較多所以要求用包含所有參數的JSON數據作為POST請求的請求體來替代FormData傳遞參數的方式,在參數量較多時POST JSON要比POST FormData便于開發和...
摘要:七夕啦,作為開發,妹子沒得撩就撩下服務器吧,妹子有得撩的同學那就左擁妹子右抱服務器吧,況且妹子是要禮物的,服務器又不用。下面我們來看一些常用的情景,我們需要如何打扮自己配置參數才能正確撩妹正確撩到服務器。 七夕啦,作為開發,妹子沒得撩就撩下服務器吧,妹子有得撩的同學那就左擁妹子右抱服務器吧,況且妹子是要禮物的,服務器又不用。好啦,長話短說再長說,祭出今天的工具——CURL(Client...
閱讀 1823·2021-09-28 09:46
閱讀 3143·2019-08-30 14:22
閱讀 1878·2019-08-26 13:36
閱讀 3343·2019-08-26 11:32
閱讀 2081·2019-08-23 16:56
閱讀 1151·2019-08-23 16:09
閱讀 1303·2019-08-23 12:55
閱讀 2148·2019-08-23 11:44