nastya97core
@nastya97core
Начинающий программист

Как через curl отправить body или как сделать аналогичный запрос, как в js?

Здравствуйте. Мне нужно сделать аналогичный запрос, как этот:
fetch('/cms/api/collections/get/ende?token=account-2d62f0209212457d0138c79cefaa06', {
    method: 'post',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
        filter: {bol:false},
    })
})
.then(res=>res.json())
.then(res => console.log(res));


Я попыталась сделать так:
function myapi($method, $target, $token, $data = false) {
	$domain = $_SERVER['HTTP_HOST'];
	$prefix = $_SERVER['HTTPS'] ? 'https://' : 'http://';
	$ch = curl_init("$prefix$domain/cms/api/$method$target?token=$token");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
	$curlRes1 = curl_exec($ch);
	curl_close($ch);
	return json_decode($curlRes1, true);
}
$data = json_encode(["filter" => ["bol"=>false]]);

$carts = myapi("collections/get/", "ende", "account-2d62f0209212457d0138c79cefaa06", $data);


Но данные не принялись и вернулся обычный массив без условий. Я понимаю, что там оно отправляется в body, а я просто шлю post запрос.

Подскажите, что нужно написать в curl, чтобы условия были учтены?

p.s. вся суть в этой строке:
$data = json_encode(["filter" => ["bol"=>false]]);
  • Вопрос задан
  • 34 просмотра
Решения вопроса 1
@Mellorn
Первое: правильный Content-Type
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);

Второе: данные в правильном формате. Вы должны передавать именно json. В прочем, вижу, что данные вы приводите к JSON-формату.

ДОПОЛНЕНИЕ
Неплохо бы так же в заголовках длину данных передавать.
Т.е. немного перепишем.
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Length: '.strlen($data)]);


Дополнение (2)
Если приходится много работать с подобным, вместо использования сырого CURL, можно посмотреть в сторону готовых клиентов. Например: Guzzle.
В принципе, можете делать всё то же, но более приятное апи.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы