您可以在 Guzzle POST 正文中包含原始 JSON 吗?

新手上路,请多包涵

这应该很简单,但我花了几个小时寻找答案并且真的被困住了。我正在构建一个基本的 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();

原文由 Jason Hill 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 446
2 个回答

您可以通过 '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, ...),
]);

原文由 Ja͢ck 发布,翻译遵循 CC BY-SA 4.0 许可协议

Guzzle 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,输出才被格式化。

原文由 Rinto George 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏