首页 > 解决方案 > GuzzleHttp\\Exception\\ClientException:客户端错误:`POST 导致 `400 Bad Request` 响应:\n{"@context":"\\/api\\/contexts

问题描述

我使用本教程https://symfonycasts.com/screencast/api-platform构建了一个 API 端点。我已经从 Web 界面测试了 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 以编程方式向服务器生成正确的帖子?

标签: phpapi-platform.comsymfony5

解决方案


首先,请不要发布敏感数据,如患者 ID、站点 ID 或您的应用程序 URL。

关于您的问题...在您的 curl 命令中,您使用参数名称vistreason,但在您的 Guzzle 请求中,您使用visitreason.

我已经用 Postman 进行了测试,它返回了 500 服务器错误,因为该字段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 交互!


推荐阅读