PHP cURL - Как отправить тело запроса? - PullRequest
1 голос
/ 20 июня 2020

У меня проблема при попытке отправить запрос к API, используя PHP. У меня нет контроля над сервером API, и я должен отправлять данные в том формате, который они запрашивают. Их единственная реальная документация - это следующий пример для CLI:

curl -X POST 'http://username:password@domain.tld/foo/bar?param1=false&param2=0' -d 'Hello World!'

Пытаясь поместить это в PHP, я воспроизвел большую часть этого, я думаю, с помощью кода ниже :

$ch = curl_init();
$username="username";
$password="password";
$data="Hello World!";
$url = "http://" . $username . ":" . $password . "@domain.tld";
$postvars = array( "param1"=>"false", "param2"=>0 );
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$postvars);
curl_setopt($ch,CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT ,3);
curl_setopt($ch,CURLOPT_TIMEOUT, 20);
$response = curl_exec($ch);
curl_close ($ch);

но я не могу понять, куда идет часть данных? Как мне отправить тело запроса (часть после -d?

Я не вижу ничего в документации PHP cURL, что указывает, как должно формироваться тело запроса.

Ответы [ 3 ]

3 голосов
/ 20 июня 2020

Вам нужно опубликовать данные тела, используя опцию CURLOPT_POSTFIELDS, и добавить параметры к URL-адресу вместо настройки в качестве полей сообщения.

Итак, ваш код будет:

$ch = curl_init();
$username = "username";
$password = "password";
$data = "Hello World!";

$url = "http://" . $username . ":" . $password . "@domain.tld";
$params = array( "param1"=>"false", "param2"=>0 );

$url .= "?" . http_build_query($params);

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);
$response = curl_exec($ch);
curl_close($ch);
2 голосов
/ 20 июня 2020

Использование CURLOPT_POSTFIELDS например:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://username:password@domain.tld/foo/bar?param1=false&param2=0');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "Hello World!");
curl_setopt($ch, CURLOPT_POST, 1);

$headers = array();
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
curl_close ($ch);
0 голосов
/ 20 июня 2020

Что касается полей POST, вам нужна опция CURLOPT_POSTFIELDS.

Пример:

CURLOPT_POSTFIELDS => array('var1' => 1,'var2' => 2)

Что касается имени пользователя и пароля, я бы посоветовал вам использовать CURLOPT_USERPWD.

Пример:

CURLOPT_USERPWD => "$username:$password"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...