GuzzleHttp \\ Exception \\ ClientException: ошибка клиента: `POST привел к ответу` 400 Bad Request`: \ n {"@ context": "\\ / api \\ / contexts - PullRequest
0 голосов
/ 28 февраля 2020

Я построил конечную точку API, используя это руководство https://symfonycasts.com/screencast/api-platform. Я проверил API из веб-интерфейса, и он принимает входные данные и сохраняет данные. Сейчас я пытаюсь отправить данные из моего приложения в конечную точку.

 curl -X POST "https://myweblocation.app/api/emergencyvisits" -H "accept: application/ld+json" -H "Content-Type: application/json" -d "{\"externalpatientid\":\"<patient-id>\",\"externalsiteid\":\"<site-id>\",\"poscode\":20,\"dos\":\"2020-02-28T00:10:52.416Z\",\"vistreason\":\"chest hurting bad\"}"

Мой код такой:

    $client = new Client(['verify' => 'my/pem/location.pem' ]);
    $siteid = $GLOBALS['unique_installation_id'];

    $body = [
        'externalpatientid' => $uuid,
        'externalsiteid' => $siteid,
        'poscode' => $pos_code,
        'dos' => $date,
        'visitreason' => $reason
    ];

    $headers = [
    'content-type' => 'application/json',
        'accept' => 'application/ld+json'
    ];

    $request = new Request('POST', 'https://myweblocation.app/api/emergencyvisits', $headers, json_encode($body));

    $response = $client->send($request, ['timeout' => 2]);

Как заставить Guzzle программно производить правильный пост на сервер

1 Ответ

2 голосов
/ 28 февраля 2020

Прежде всего, пожалуйста, не публикуйте конфиденциальные данные, такие как идентификатор пациента, идентификатор сайта или URL вашего приложения.

Относительно вашей проблемы ... В вашей команде curl вы используете имя параметра vistreason но в своем запросе на Guzzle вы используете visitreason.

Я проверил это на Postman, и он вернул ошибку 500 Server, поскольку поле vistreason не может быть пустым.

Кроме того, я проверил с помощью Guzzle (6.x):

$client = new Client(['verify' => false]); // I deactivated ssl verification
$body = [
    'externalpatientid' => '<id from curl request>',
    'externalsiteid' => '<id from curl request>',
    'poscode' => 20,
    'dos' => '2020-02-28T00:10:52.416Z',
    'vistreason' => 'chest hurting bad'
];

$response = $client->request(
    'POST',
    '<your-server-api-url>',
    [
        'headers' => [
            'content-type' => 'application/json',
            'accept' => 'application/ld+json'
        ],
        'body' => json_encode($body),
    ]
);

var_dump(json_decode($response->getBody()->getContents()));
// Output seems to be a valid response with some data from the request.

Возможно, что-то не так с вашим сертификатом для проверки.

Примечание: Я также очень рекомендую реализовать аутентификацию в виде токена для взаимодействия с вашим API!

...