@dake1231

Как правильно отправить json через POST с помощью CURL?

Здравствуйте! Нужно с некоторых сайтов, к серверу которых у меня нет доступа, брать данные которые тянутся через формы. Я хотел сделать так: Заполнить формы и отправить их один раз вручную и посмотреть какие данные в каком формате уходят на сервер, затем просто подставлять свои переменные в будущем. GET, POST с Content-Type:application/x-www-form-urlencoded я получаю через CURL, но вот POST c application/json не могу получить.

Вот примерный код:
<?
	$data = array("name" => "Hagrid", "age" => "36");                                                                    
	$data_string = json_encode($data);                                                                                   
	 
	$ch = curl_init('http://api.local/rest/users');                                                                      
	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");                                                                     
	curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                                                                  
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);                                                                      
	curl_setopt($ch, CURLOPT_HTTPHEADER, array(                                                                          
	    'Content-Type: application/json',                                                                                
	    'Content-Length: ' . strlen($data_string))                                                                       
	);                                                                                                                   
	 
	$result = curl_exec($ch);
?>

В ответ просто пустота, может быть проблема в том что json_encode возвращает строку а не json?
  • Вопрос задан
  • 56168 просмотров
Пригласить эксперта
Ответы на вопрос 4
brutto
@brutto
Conceptmeister, Darudar
Если вы шлёте на сервер application/json, то в $_POST у вас ничего не окажется -- он будет пустым. Что бы прочитать такой POST-запрос вам понадобится что-то вроде этого:

$json = file_get_contents('php://input');
$obj = json_decode($json);

Подозреваю, что тут есть ответ на ваш вопрос:
stackoverflow.com/questions/19004783/reading-json-...

PS: О том что такое php://input и как с ним можно работать и когда говорится вот тут: php.net/manual/ru/wrappers.php.php
Ответ написан
seregazolotaryow64
@seregazolotaryow64
IT Специалист и самоучка
Ребята, возникла такая же проблема как у вас:

Сейчас пытаюсь доработать структуризацию подключения к API Яндекс.Кассы посредством CUrl и вдруг Яндекс требует POST-запрос в JSON-формате. Перепробовал все инструкции, вроде всё правильно и так не работает...

Пример кода:
<?php
$urlreturn="https://good-adults.ru/donation/payment/send/send?sucess=yes";
                 $method="sberbank";

                  $url="https://payment.yandex.net/api/v3/payments";

                    $idempotence = uniqid('', true);
                    $headers=array(
                        "Idempotence-Key:". $idempotence,
                        "Content-Type: application/json"
                    );

                    $data=array(
                        "amount"=>array(
                            "value"=>$money .".00",
                            "currency"=>"RUB"
                        ),
                        "payment_method_data"=>array(
                            "type"=>$method
                        ),
                        "confirmation"=>array(
                            "type"=>"redirect",
                            "return_url"=>$urlreturn
                        ),
                        "description"=>"Благотворительное пожертвование"
                    );

                    $ch = curl_init();

                    curl_setopt($ch, CURLOPT_URL, $url);
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    curl_setopt($ch, CURLOPT_FAILONERROR, 1);



                    curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
                    curl_setopt($ch, CURLOPT_USERPWD, "596115:test_ZZ88TGAJiMajCoMVlZyYAkov7inGurf2ZdYkXkrVQqQ");
                    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
                    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
                    curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));

                    $data = curl_exec($ch);

                    if(curl_close($ch)){
                            $obj=json_decode($data,true);
                       

                            
                            $redirect=$obj->confirmation->confirmation_url;
                            setcookie('payment_id',$status->id,time()+14400);
                            header("Location:". $redirect);
                            
                    }

?>

Всё правильно написано?
Ответ написан
Комментировать
copist
@copist
Empower people to give
Пример ты взял (приблизительно) отсюда www.lornajane.net/posts/2011/posting-json-data-wit... и очевидно, что у автора статьи всё работает

Если тебе приходит пустота, то скорее всего на сервере фатальная ошибка.
Проверяй error.log веб-сервера.
Ответ написан
@Nc_Soft
Убери custom_request и content-length, остальное оставь, можно x-http-requested-with и user-agent добавить.
Ещё curl_getinfo() в помощь.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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