PHP cURL - неверная схема для запроса json - PullRequest
0 голосов
/ 10 мая 2018

Я пытаюсь реализовать следующий запрос cURL в php:

curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: login:password" \
-d '{"phone": "+48667421797", "msg": "Great app! Thank you!"}' \
https://some.endpoint.url

Он отлично работает в консоли, мне также удалось использовать этот запрос в таких инструментах, как почтальон / бессонница.

Но когда я пытаюсь реализовать это в PHP, вот так:

    $fields = [
        'phone' => $number,
        'msg'   => $msg,
    ];

    $data = json_encode($fields);

    $headers = [
        'Content-Type: application/json',
        'Authorization: login:password'
    ];

    $ch = curl_init($url);

    curl_setopt($ch,CURLOPT_POST, 1);                                                    
    curl_setopt($ch,CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch,CURLOPT_HTTPHEADER, $headers);

    curl_setopt($ch, CURLOPT_URL, config('kajaki.sms_url'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);


    $response = curl_exec($ch);

    curl_close($ch);

Я получаю 400: Incorrect schema, что указывает AFAIK, что запрос не отправляется как действительный запрос JSON.

Что не так? Как правильно отправить этот запрос в формате JSON?

К сожалению, этот API не предоставляет никакой документации.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы можете написать небольшой тестовый скрипт, который печатает полученную строку JSON, а затем протестировать как команду CLI curl, так и вашу реализацию с тестовым скриптом. Являются ли полученные данные JSON одинаковыми? Если нет, то чем отличаются данные от реализации PHP?

index.php

<?php
var_dump(file_get_contents('php://input'));

Запустить тестовый веб-сервер

cd directory/containing/index.php
php -S localhost:12345

Отправка данных с помощью cURL на CLI

user@host $ curl -X POST \
> -H "Content-Type: application/json" \
> -H "Authorization: login:password" \
> -d '{"phone": "+48667421797", "msg": "Great app! Thank you!"}' \
> http://localhost:12345
string(57) "{"phone": "+48667421797", "msg": "Great app! Thank you!"}"

Отправка данных с помощью cURL через PHP

// Modify the URL
curl_setopt($ch, CURLOPT_URL, 'http://localhost:12345');

Если данные JSON совпадают, вам следует также рассмотреть вопрос о том, могут ли другие части запроса быть недействительными, например, заголовки HTTP или URL.

0 голосов
/ 10 мая 2018

У меня раньше была похожая проблема, я не знаю, сработает ли она для вас, но вы можете попробовать addslashes() вот так:

$fields = [
    'phone' => "+48667421797",
    'msg'   => "Great app! Thank you!",
];

$data = addslashes(json_encode($fields)); 
// outputs {\"phone\":\"+48667421797\",\"msg\":\"Great app! Thank you!\"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...