PHP Curl: почему curl_setopt_array () не работает для этих двух параметров? - PullRequest
1 голос
/ 11 октября 2019

Обратите внимание на код ниже и обратите внимание на прокомментированные параметры скручивания в массиве. Этот код выполняется "как есть" и возвращает допустимый ожидаемый XML-ответ.

protected function curlResponse($params)
{
    // Returns valid XML
    $xml = $this->TokenXml($params);
    $len = strlen($xml);
    // Returns array of headers Content-Type, SOAPAction and Content-Length
    $headers = $this->TokenHeaders($len);

    $curlopts = [
        CURLOPT_RETURNTRANSFER => 1,
        CURLOPT_SSL_VERIFYPEER => 0,
        CURLOPT_SSL_VERIFYHOST => 0,
        CURLOPT_HEADER => FALSE,
        CURLOPT_URL => $params['tokenURL'],
        //CURLOPT_POSTFIELDS, $xml,
        //CURLOPT_HTTPHEADER, $headers
    ];

    $ch = curl_init();
    curl_setopt_array($ch, $curlopts);
    // Now swap the commented lines above and comment out these two. Fails.
    curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $response = curl_exec($ch);

    curl_close($ch);

    return $response;
}

Раскомментируйте две строки в массиве и закомментируйте обе строки curl_setopt (). Код не выполняется.

Под ошибкой я подразумеваю, что в первом случае получатель в $ params ['tokenURL'] возвращает действительный XML-ответ с токеном, а во втором - с ошибками, как описано ниже. В документации говорится, что curl_setopt_array () является вполне допустимой альтернативой повторяющимся curl_setopt ().

Ошибки:

Если в массиве находится просто CURLOPT_HTTPHEADER, получает "Сервер не может обработать запрос, потому что тип носителя не поддерживается. "

Если в массиве опций находится только CURLOPT_POSTFIELDS, то время ожидания запроса истекает / прекращается.

Если опции ОБА находятся вмассив параметров возвращает полную HTML-страницу «справки / использования», которая сообщает, что он не получает или не анализирует XML: «Поддерживаются следующие операции .....»

(Моя «операция» указана на этой странице)

Есть ли очевидное объяснение или что-то глупое, которое я пропускаю?

$ lsb_release -a
Description:    Ubuntu 18.04.3 LTS
Release:    18.04

$ php -v
PHP 7.2.19-0ubuntu0.18.04.2 (cli) (built: Aug 12 2019 19:34:28) ( NTS )

$ curl --version
curl 7.58.0 (x86_64-pc-linux-gnu) libcurl/7.58.0 OpenSSL/1.1.1 zlib/1.2.11 libidn2/2.0.4 libpsl/0.19.1 (+libidn2/2.0.4) nghttp2/1.30.0 librtmp/2.3 

$ docker -v
Docker version 19.03.2, build 6a30dfc
...