当前位置: 首页 > 知识库问答 >
问题:

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

齐俊达
2023-03-14

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

我试着创建一个工作的客户端,但是服务器回应‘无效请求’,我想知道我发布的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();

共有3个答案

安明亮
2023-03-14

您可能需要设置主体mime类型。使用setBody()方法可以很容易地做到这一点。

$request = $client->post(env('NETO_API_URL'), ['headers' => $headers]);
$request->setBody($GetOrder, 'application/json');
浦毅
2023-03-14

狂饮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,输出都没有格式化。

明松
2023-03-14

您可以通过'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,
]);
 类似资料:
  • 问题内容: 如何访问expressjs给我的请求对象的原始内容? 问题答案: 除非添加中间件,否则默认值不会缓冲数据。一种简单的解决方案是按照下面@Stewe的答案中的示例进行操作,该示例将自己连接所有数据。例如 不利的一面是,您现在已将所有POST正文内容作为连续的块移到RAM中,这可能不是必需的。另一个选项值得考虑,但取决于您需要在帖子正文中处理多少数据,而是将数据作为流处理。 例如,对于XM

  • 问题内容: 当我使用Jackson对该对象进行反序列化时,我试图在Java对象中包含原始JSON。为了测试此功能,我编写了以下测试: 代码输出以下行: JSON正是我想要的外观。不幸的是,当尝试将JSON读回对象时,代码将失败并出现异常。这是例外: org.codehaus.jackson.map.JsonMappingException:无法从[源:java.io.StringReader@d7

  • 下面的API接受来自客户端的json字符串,并将其映射到电子邮件对象中。如何将请求正文()作为原始字符串获取?(我需要原始字符串和键入版本的参数) PS:这个问题不是重复的:如何在SpringREST控制器中访问普通json主体?

  • 问题内容: 考虑: 那么我们如何获得报价,而不是斜杠? 并且请不要建议,因为那样的话,问题就变成了我们如何包括两种引号? 问题答案: 如果要在字符串中使用双引号而不是单引号,则可以只使用单引号作为分隔符: 如果在字符串中需要两种引号,请使用三引号引起来的字符串: 如果要在字符串中同时包含两种用三引号引起来的字符串(一种极不可能的情况),则不能这样做,并且必须使用带有转义符的非原始字符串。

  • 问题内容: 在Java中,原始类型和数组是否具有包含包? 可能不是,但是只是想确定一下。 问题答案: 简单答案 让我们测试一下: 输出: 空 null 不,他们不:-) 基本类型 原始类是没有包的特殊构造。供参考,请参阅的来源,别名为: 如您所见,原始类是通过package-private和native机制加载的: 并投射到(我想为了启用自动装箱) 包装器类型及其原始类型 顺便说一句:每个包装器类

  • 问题内容: 我有三种模式: 我想获取包含A的所有B和C的json数据。我尝试了许多类似的操作: 但没有任何效果。什么是做到这一点的好方法。 问题答案: 请参阅以查看可以传递给的选项。报价: 要包括关联,请使用… 二级和更高级别的关联也可以工作: 不需要像自动那样直接调用或直接调用。