Как передать массив в curl с &? - PullRequest
0 голосов
/ 28 марта 2019

Я сделал одну функцию вызова curl, как показано ниже:

public function curl($url, $post = array()){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.12) Gecko/20070508 Firefox/1.5.0.12");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $this->ckfile);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $this->ckfile);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    // curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,2);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    curl_setopt($ch,CURLOPT_URL, $url);
    if(!empty($post)){
        $post_string = "";
        foreach($post as $key=>$value) { $post_string .= $key.'='.urlencode($value).'&'; }
        rtrim($post_string, '&');
        curl_setopt($ch,CURLOPT_POST, count($post));
        curl_setopt($ch,CURLOPT_POSTFIELDS, $post_string);
    }
    $res = curl_exec($ch);
    if (curl_errno($ch)) {
        $this->deliver_responce('201','Couldn\'t send request: ' . curl_error($ch));exit();
    }
    else {
        $resultStatus = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        if ($resultStatus == 200) {
            //echo "Post Successfully!";
            return true;
        }
        else{
            $this->deliver_responce('200','Request failed: HTTP status code: ' . $resultStatus);exit();
        }
    }
}

Мне нужно вызвать ее с URL и массивом, который я хочу опубликовать.Это работает, когда массив имеет ключ и значение, но не работает, когда у меня есть вложенный массив.Это работает для:

array(
    'id'=>1,
    'name'=>'apple'
)

, но не работает для

array(
    'id'=>5,
    'cmd'=>array('password','encrypt','decrypt')
)

Я думаю, что проблема в:

foreach($post as $key=>$value) { $post_string .= $key.'='.urlencode($value).'&'; }

В моей функции, но я не знаюкак это сделать.

Ответы [ 3 ]

0 голосов
/ 28 марта 2019

Для этого типа почтовых данных вы должны использовать данные JSON и анализировать json на стороне сервера.Но если у вас нет контроля над URL, на который вы отправляете данные, вы можете отправить вложенный массив, используя следующие строки.нет необходимости конвертировать массив inyo-строки вручную.

curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-type: multipart/form-data"));

curl_setopt($ch, CURLOPT_POSTFIELDS, urldecode(http_build_query($post_array)));
0 голосов
/ 29 марта 2019

решено изменение цикла foreach, например

foreach($post as $key=>$value) { 
    if (is_array($value)) {
        foreach ($value as $val) {
            $post_string .= $key.'[]='.urlencode($val).'&';
        }
    } 
    else{ 
        $post_string .= $key.'='.urlencode($value).'&'; 
    }
}
0 голосов
/ 28 марта 2019

Для создания запроса uri есть функция http_build_query:

if (!empty($post)) {
    curl_setopt($ch,CURLOPT_POST, true);
    curl_setopt($ch,CURLOPT_POSTFIELDS, http_build_query($post));
}

Однако согласно руководство (выделеноme):

Этот параметр может быть передан в виде строки с кодировкой urlen *, например 'para1 = val1¶2 = val2 & ...' или в виде массива * 1017.* с именем поля в качестве ключа и данными поля в качестве значения.

Итак, вы можете попробовать передать массив $post напрямую, без преобразования его в строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...