2016-01-20 104 views
8

我在PHP中使用Guzzle(v6.1.1)向服务器发出POST请求。它工作正常。我添加了一些日志记录功能来记录发送和接收的内容,我无法弄清楚如何获取Guzzle发送到服务器的数据。我可以得到的回应蛮好的,但我怎么得到发送数据? (这将是JSON字符串。)如何使用Guzzle PHP获得SENT数据的主体?

这里是我的代码的相关部分:

$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专家,所以我没有提供任何有用的东西。我也搜索了很多谷歌,但只发现有人在讨论从服务器获取响应,我毫不犹豫。

回答

7

您可以通过创建一个Middleware来完成这项工作。

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; 
      } 
     ); 
    }; 
}); 
+0

这两个都会导致出现问题,并从服务器获取404。 – ruhnet

+0

我刚刚尝试过(guzzle 6.1),它适用于我。你能发布你的完整代码吗? – Federkun

+0

我编辑了我的问题以显示实际的代码,除了变量赋值和这些不相关。我通过在我的代码之前添加所有中间件代码,并在客户端对象创建命令中添加''handler'=> $ stack'来尝试所发布的内容。 – ruhnet

1

您可以通过执行

$data = array(
    "key" => "value", 
    "key2" => "value", 
); 

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

// ... 

echo json_encode($data); 

这将输出数据作为JSON字符串复制由请求创建的数据字符串。在http://php.net/manual/fr/function.json-encode.php

EDIT

狂饮

文档具有RequestResponse类(和许多其他)。
Request实际上有一个getQuery()方法,该方法将包含您的data的对象返回为私有,与所有其他成员相同。
你也无法访问它。

这就是为什么我认为手动编码它是更简单的解决方案。 如果您想知道Guzzle做了什么,它也有一个Collection类,它可以转换数据并根据请求发送数据。

+1

是的,我知道我可以这样做,但希望Guzzle中有一个内置的函数,可以让我得到请求,就像我可以得到的一样'response-> getBody();' – ruhnet

+0

我已经更新了我的回答 – chalasr

+0

啊,是的,我尝试过getQuery(),但它没有工作,所以如果它是私人的,那就是原因。感谢您为我澄清这一点。 – ruhnet