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

如何使用Guzzle PHP获取SENT数据的主体?

叶经略
2023-03-14

我使用PHP中的Guzzle(v6.1.1)向服务器发出POST请求。它工作得很好。我添加了一些日志功能来记录发送和接收的内容,但我不知道如何获取Guzzle发送到服务器的数据。我可以很好地获得响应,但如何获得发送的数据?(这将是JSON字符串。)

以下是我代码的相关部分:

$client = new GuzzleHttp\Client(['base_uri' => $serviceUrlPayments ]);
    try {
       $response = $client->request('POST', 'Charge', [
            'auth' => [$securenetId, $secureKey],
            'json' => [     "amount" => $amount,
                            "paymentVaultToken" => array(
                                    "customerId" => $customerId,
                                    "paymentMethodId" => $token,
                                    "publicKey" => $publicKey
                                    ),
                            "extendedInformation" => array(
                                    "typeOfGoods" => $typeOfGoods,
                                    "userDefinedFields" => $udfs,
                                    "notes" => $Notes
                                    ),
                            'developerApplication'=> $developerApplication 
            ]
    ]);

    } catch (ServerErrorResponseException $e) {
        echo (string) $e->getResponse()->getBody();
    }


    echo $response->getBody(); // THIS CORRECTLY SHOWS THE SERVER RESPONSE
    echo $client->getBody();           // This doesn't work
    echo $client->request->getBody();  // nor does this

任何帮助将不胜感激。我确实尝试在Guzzle源代码中查找类似于getBody()的函数,该函数可以与请求一起使用,但我不是PHP专家,所以我没有提出任何有用的东西。我也搜索了很多谷歌,但发现只有人们在谈论从服务器获得响应,我没有遇到任何问题。

共有3个答案

殷安顺
2023-03-14

我从5.7开始的Laravel解决方案:

MessageFormatter使用变量替换,请参见:https://github . com/guzzle/guzzle/blob/master/src/message formatter . PHP

     $stack = HandlerStack::create();
        $stack->push(
            Middleware::log(
                Log::channel('single'),
                new MessageFormatter('Req Body: {request}')
            )
     );

    $client = new Client();
    $response = $client->request(
        'POST',
        'https://url.com/go',
        [
            'headers' => [
                "Content-Type" => "application/json",
                'Authorization' => 'Bearer 123'
            ],
            'json' => $menu,
            'handler' => $stack
        ]
    );
翟奕
2023-03-14

使用Guzz 6.2。

在过去的几天里,我也一直在努力解决这个问题,同时试图构建一种用于审核HTTP与不同API交互的方法。在我的情况下,解决方案是简单地倒带请求正文。

请求主体实际上是作为流实现的。因此,当发送请求时,Guzzle从流中读取。读取完整的流会将流的内部指针移动到末尾。因此,在发出请求后调用getContents()时,内部指针已经位于流的末尾,并且不返回任何内容。

解决办法?将指针倒回到开头,再次读取流。

<?php
// ...
$body = $request->getBody();
echo $body->getContents(); // -->nothing

// Rewind the stream
$body->rewind();
echo $body->getContents(); // -->The request body :)
段干安和
2023-03-14

您可以通过创建中间件来完成这项工作。

use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;
use GuzzleHttp\Middleware;
use Psr\Http\Message\RequestInterface;

$stack = HandlerStack::create();
// my middleware
$stack->push(Middleware::mapRequest(function (RequestInterface $request) {
    $contentsRequest = (string) $request->getBody();
    //var_dump($contentsRequest);

    return $request;
}));

$client = new Client([
    'base_uri' => 'http://www.example.com/api/',
    'handler' => $stack
]);

$response = $client->request('POST', 'itemupdate', [
    'auth' => [$username, $password],
    'json' => [
        "key" => "value",
        "key2" => "value",
    ]
]);

但是,这是在接收响应之前触发的。你可能想这样做:

$stack->push(function (callable $handler) {
    return function (RequestInterface $request, array $options) use ($handler) {
        return $handler($request, $options)->then(
            function ($response) use ($request) {
                // work here
                $contentsRequest = (string) $request->getBody();
                //var_dump($contentsRequest);
                return $response;
            }
        );
    };
});
 类似资料:
  • 问题内容: 如何从中加载数据并返回Map接口。如何在内部维护查询数据。我尝试加载,但出现以下异常,即 org.springframework.dao.IncorrectResultSizeDataAccessException:错误的结果 码:- 请帮我 问题答案: 如果您想获得一行,则比较合适。您选择的是无子句,因此您可能想要。该错误可能表明需要一行,但您查询的却是很多行。 查看文档。 有一个只

  • 我正在创建一个fetchBill函数。分配https://randomapi.com/api/006b08a801d82d0c9824dcfdfdfa3b3c到一个api变量。它使用浏览器的fetch函数向api发出HTTP请求。它在一个函数中使用箭头函数。然后调用fetch函数,并在将其转换为JSON后返回响应。使用另一个。然后调用第一个函数,该函数将JSON数据传递给displayCartTo

  • 我正在尝试使用主干从MySQL(使用基于PHP的API)获取数据。我想检索20个批次的项目。例如,我有10000条记录,但只想在页面加载时显示20条记录。当用户向下滚动时,我希望在每次到达页面底部时加载下一个20。我的查询没有按ID(按设计)排序,因此可能会增加一级复杂性。如何在主干中实现这一点?

  • 问题内容: 我尝试使用FirebaseUI-Android库简单地在回收视图中显示数据集。 借助push()方法,数据以列表形式存储在Firebase中。 当我获得数据时,我首先获得了最早的数据,而我的要求则是最年轻的。所以我需要一个相反的顺序。 有没有办法用FirebaseUI本身做到这一点? 使用Firebase Core,似乎只有两种可能的方法是(从Display帖子按降序排列): @Kat

  • 我正在通过Vuex商店中的axios从外部API获取数据,它为我提供了一个包含对象的数组——比方说——。 每个都有一个,我需要用它获取城市详细信息。我想将这个details对象作为一个新键添加到数组中。 现在我正在获取所有城市,并使用另一个Vuex操作获取城市详细信息。 所有城市的行动 获取所有城市后的变异 数组中的每个对象都有一个,我正在用它获取这个城市的详细信息。 我试图在动作中循环数组,以获

  • 我希望在JMETER中实现以下功能 JMeter加载带有id号的CSV文件 Jmeter中的每个用户/线程选择一个id号,并将其添加到他们的HTTP请求中,例如HTTP:www.testsite.com/test.php?id=x 重复步骤2,选择文件中的下一个id号。 这样,我就可以测试我的servlet是否使用连接池执行多个线程。 谢谢