Перевести запрос cURL в Guzzle

Я пытаюсь использовать Guzzle вместо прямого использования cURL для достижения HTTP-запроса. Как мне сделать такой же запрос, но с помощью Guzzle? Или я должен просто придерживаться cURL?

$ch = curl_init();
// Set the URL
curl_setopt($ch, CURLOPT_URL, $url);
// don't verify SSL certificate
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
// Return the contents of the response as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Follow redirects
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// Set up authentication
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_USERPWD, "$token:X");

Вот как у меня получилось. Я продолжаю сталкиваться с ошибкой 401 Unauthorized. Я знаю, что у меня правильные полномочия. Что заставляет меня думать, что я не на правильном пути, так это то, что в документации Guzzle говорится: аутентификация в настоящее время поддерживается только при использовании обработчика cURL, но планируется создать замену, которую можно будет использовать с любым обработчиком HTTP. Но, насколько я понимаю, Guzzle по умолчанию использует cURL.

$guzzleData = [
  'auth' => [$token, 'X'],
  'allow_redirects' => true,
  'verify' => false,
];

$client = new \Guzzle\Http\Client();
$request = $client->get($url, $guzzleData);
$response = $request->send();

person aran    schedule 31.07.2015    source источник
comment
Вы, вероятно, получите больше ответов на свой вопрос при публикации на Stack Exchange, проголосовав за миграцию.   -  person carlcs    schedule 31.07.2015
comment
Как упоминал @carlcs, этот вопрос гораздо лучше подходит для переполнения стека. Хотя это полезно для некоторых разработчиков плагинов Craft, на самом деле это не вопрос Craft как таковой.   -  person Lindsey D    schedule 31.07.2015
comment
Ницца! Мне удалось проголосовать дважды, один раз на Craft SE, а теперь здесь! :)   -  person carlcs    schedule 31.07.2015


Ответы (2)


Вот решение:

$client = new \Guzzle\Http\Client();
$request = $client->get($url);

$request->getCurlOptions()->set(CURLOPT_SSL_VERIFYHOST, false);
$request->getCurlOptions()->set(CURLOPT_SSL_VERIFYPEER, false);
$request->getCurlOptions()->set(CURLOPT_RETURNTRANSFER, true);
$request->getCurlOptions()->set(CURLOPT_FOLLOWLOCATION, true);
$request->getCurlOptions()->set(CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
$request->getCurlOptions()->set(CURLOPT_USERPWD, "$token:X");

$response = $request->send();
person aran    schedule 31.07.2015
comment
этот ответ не работает с текущим guzzlehttp - person bhucho; 07.04.2021
comment
Это работает для старой версии, такой как guzzle 3? - person Hamham; 01.07.2021

Решение, которое мне удалось заставить работать для Guzzle6, таково:

$headers = array();
$headers['grant_type'] = 'client_credentials';
$headers['client_id'] = $clientid;
$headers['client_secret'] = $clientSecret;

$response = $this->client->post($urlAuth, ['form_params' => $headers]);
$output = $response->getBody()->getContents();

т.е. массив заголовков должен быть обернут в 'form_params'

person Lea de Groot    schedule 21.02.2017
comment
Я не понимаю, как переводится CURLOPT_RETURNTRANSFER - person simPod; 21.10.2018