成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP cURL請(qǐng)求中CURLOPT_POSTFIELDS只支持一維數(shù)組

airborne007 / 849人閱讀

摘要:使用發(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_POSTCURLOPT_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

相關(guān)文章

  • PHP cURL請(qǐng)求詳解

    摘要:不支持多進(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...

    paney129 評(píng)論0 收藏0
  • 考慮 PHP 5.0~5.6 各版本兼容性的 cURL 文件上傳

    摘要:最近做的一個(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的官方中文文檔!版本...

    NikoManiac 評(píng)論0 收藏0
  • 【web開發(fā)】php服務(wù)端提交post請(qǐng)求

    摘要:參見請(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 (...

    AndroidTraveler 評(píng)論0 收藏0
  • PHP發(fā)送和接收J(rèn)SON請(qǐng)求

    摘要:發(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ā)和...

    PiscesYE 評(píng)論0 收藏0
  • PHP使用CURL,“撩”服務(wù)器需幾行——php curl詳細(xì)解析和常見大坑

    摘要:七夕啦,作為開發(fā),妹子沒得撩就撩下服務(wù)器吧,妹子有得撩的同學(xué)那就左擁妹子右抱服務(wù)器吧,況且妹子是要禮物的,服務(wù)器又不用。下面我們來看一些常用的情景,我們需要如何打扮自己配置參數(shù)才能正確撩妹正確撩到服務(wù)器。 七夕啦,作為開發(fā),妹子沒得撩就撩下服務(wù)器吧,妹子有得撩的同學(xué)那就左擁妹子右抱服務(wù)器吧,況且妹子是要禮物的,服務(wù)器又不用。好啦,長話短說再長說,祭出今天的工具——CURL(Client...

    SexySix 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<