2016-01-20 14 views
8

Sto usando Guzzle (v6.1.1) in PHP per fare una richiesta POST a un server. Funziona bene. Aggiungo alcune funzioni di registrazione per registrare ciò che è stato inviato e ricevuto e non riesco a capire come ottenere i dati inviati da Guzzle al server. Posso ottenere la risposta correttamente, ma come faccio a ottenere i dati inviati? (Che sarebbe la stringa JSON.)Come posso ottenere il corpo dei dati SENT con Guzzle PHP?

Ecco la quota di competenza del mio codice:

$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 

Qualsiasi aiuto sarebbe apprezzato. Ho provato a cercare in Guzzle codice sorgente per una funzione simile a getBody() che avrebbe funzionato con la richiesta, ma non sono un esperto di PHP quindi non ho trovato nulla di utile. Ho anche cercato molto su Google ma ho trovato solo persone che stavano parlando di ottenere la risposta dal server, che non ho problemi con.

risposta

7

È possibile eseguire questo lavoro creando un 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", 
    ] 
]); 

Questo, tuttavia, viene attivato prima di ricevere la risposta. Si consiglia di fare qualcosa di simile:

$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

Entrambe queste cause qualcosa va storto e ottengo un 404 dal server. – ruhnet

+0

Ho appena provato (guzzle 6.1), e funziona per me. Puoi pubblicare il tuo codice completo? – Federkun

+0

Ho modificato la mia domanda per mostrare il codice attuale eccetto per le assegnazioni di variabili e tali che non sono rilevanti. Ho provato quello che hai postato aggiungendo tutto il tuo codice middleware prima del mio codice, e aggiungendo il '' gestore '=> $ stack' nel comando di creazione dell'oggetto client. – ruhnet

1

È possibile riprodurre la stringa di dati creata dalla richiesta facendo

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

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

// ... 

echo json_encode($data); 

Ciò produrrà i dati come stringa JSON.

documentazione a http://php.net/manual/fr/function.json-encode.php

EDIT

Guzzle ha una e una classe RequestResponse (e molti altri).
Request ha effettivamente un metodo getQuery() che restituisce un oggetto contenente il tuo data come privato, come tutti gli altri membri.
Inoltre non è possibile accedervi.

Questo è il motivo per cui penso che la codifica manualmente sia la soluzione più semplice. Se vuoi sapere cosa è fatto da Guzzle, ha anche una classe Collection che trasforma i dati e li invia in richiesta.

+1

Sì, sapevo che avrei potuto farlo in questo modo, ma speravo che ci fosse una funzione incorporata in Guzzle che mi avrebbe permesso di ottenere la richiesta, proprio come posso ottenere la risposta con '$ response-> getBody();' – ruhnet

+0

Ho aggiornato la mia risposta – chalasr

+0

Ah, sì ho provato getQuery() ma non ha funzionato e quindi se è privato è per questo. Grazie per aver chiarito questo per me. – ruhnet

Problemi correlati