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