你能在Guzzle POST Body中包含原始JSON吗?

2022-08-30 19:04:09

这应该很简单,但我花了几个小时寻找答案,我真的卡住了。我正在构建一个基本的Laravel应用程序,并使用Guzzle来替换我目前提出的CURL请求。所有 CURL 函数都利用正文中的原始 JSON 变量。

我正在尝试创建一个有效的Guzzle客户端,但服务器正在与“无效请求”进行交流,我只是想知道我正在发布的JSON是否发生了一些可疑的事情。我开始怀疑您是否不能在Guzzle POST请求正文中使用原始JSON?我知道标头正在工作,因为我正在从服务器收到有效的响应,并且我知道JSON是有效的,因为它当前在CURL请求中工作。所以我被困住了:-(

任何帮助将不胜感激。

        $headers = array(
            'NETOAPI_KEY' => env('NETO_API_KEY'),
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
            'NETOAPI_ACTION' => 'GetOrder'
        );

    // JSON Data for API post
    $GetOrder = '{
        "Filter": {
            "OrderID": "N10139",
                "OutputSelector": [
                    "OrderStatus"
                ]
        }
    }';

    $client = new client();
    $res = $client->post(env('NETO_API_URL'), [ 'headers' => $headers ], [ 'body' => $GetOrder ]);

    return $res->getBody();

答案 1

您可以通过“json”请求选项将常规数组作为JSON发送;这也将自动设置正确的标头:

$headers = [
    'NETOAPI_KEY' => env('NETO_API_KEY'),
    'Accept' => 'application/json',
    'NETOAPI_ACTION' => 'GetOrder'
];

$GetOrder = [
    'Filter' => [
        'OrderID' => 'N10139',
        'OutputSelector' => ['OrderStatus'],
    ],
];

$client = new client();
$res = $client->post(env('NETO_API_URL'), [
    'headers' => $headers, 
    'json' => $GetOrder,
]);

请注意,Guzzle应用json_encode()在幕后没有任何选项;如果您需要任何自定义,建议您自己做一些工作

$res = $client->post(env('NETO_API_URL'), [
    'headers' => $headers + ['Content-Type' => 'application/json'],
    'body' => json_encode($getOrders, ...),
]);

答案 2

咕噜咕噜 7 这里

下面使用原始json输入为我工作

    $data = array(
       'customer' => '89090',
       'username' => 'app',
       'password' => 'pwd'  
    );
    $url = "http://someendpoint/API/Login";
    $client = new \GuzzleHttp\Client();
    $response = $client->post($url, [
        'headers' => ['Content-Type' => 'application/json', 'Accept' => 'application/json'],
        'body'    => json_encode($data)
    ]); 
    
    
    print_r(json_decode($response->getBody(), true));

由于某些原因,直到我在响应上使用json_decode,输出未格式化。


推荐