2016-01-20 4 views
8

मैं सर्वर पर POST अनुरोध करने के लिए PHP में Guzzle (v6.1.1) का उपयोग कर रहा हूं। यह बढ़िया काम करता है। मैं जो लॉग और प्राप्त किया गया था उसे लॉग करने के लिए कुछ लॉगिंग फ़ंक्शंस जोड़ रहा हूं और मैं यह नहीं समझ सकता कि गजल सर्वर पर भेजे गए डेटा को कैसे प्राप्त करें। मैं प्रतिक्रिया ठीक कर सकता हूं, लेकिन मुझे पर डेटा कैसे भेजा जा सकता है? (जो 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 

किसी भी मदद की सराहना की जाएगी। मैंने GetBody() के समान फ़ंक्शन के लिए Guzzle Sourcecode में देखने का प्रयास किया जो अनुरोध के साथ काम करेगा, लेकिन मैं एक PHP विशेषज्ञ नहीं हूं इसलिए मैं कुछ भी उपयोगी नहीं हुआ। मैंने Google को बहुत कुछ खोजा लेकिन केवल सर्वर से प्रतिक्रिया प्राप्त करने के बारे में बात करने वाले लोगों को मिला, जिनके साथ मुझे कोई परेशानी नहीं है।

उत्तर

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

मैंने वैरिएबल असाइनमेंट को छोड़कर वास्तविक कोड दिखाने के लिए अपना प्रश्न संपादित किया है और ऐसे प्रासंगिक नहीं हैं। मैंने आपके कोड से पहले अपने सभी मिडलवेयर कोड को जोड़कर और क्लाइंट ऑब्जेक्ट सृजन कमांड में 'हैंडलर' => $ स्टैक 'जोड़कर आपके द्वारा पोस्ट की गई कोशिश की। – 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

संपादित

guzzle

प्रलेखन एक Request और एक Response वर्ग (और कई अन्य) है।
Request प्रभावी रूप से getQuery() विधि है जो आपके data को अन्य सभी सदस्यों के समान निजी रूप से एक ऑब्जेक्ट देता है।
इसके अलावा आप इसे एक्सेस नहीं कर सकते हैं।

यही कारण है कि मुझे लगता है कि इसे मैन्युअल रूप से एन्कोड करना आसान समाधान है। यदि आप जानना चाहते हैं कि Guzzle द्वारा क्या किया जाता है, तो इसमें Collection कक्षा भी होती है जो डेटा को बदलती है और अनुरोध में भेजती है।

+1

हाँ के लिए बहुत जटिल है, मुझे पता था कि मैं इसे इस तरह से कर सकता हूं, लेकिन उम्मीद है कि गुज़ल में एक अंतर्निहित कार्य था जो मुझे अनुरोध प्राप्त करने की अनुमति देगा, जैसा कि मैं प्राप्त कर सकता हूं 'प्रतिक्रिया के साथ प्रतिक्रिया-> getBody();' – ruhnet

+0

मैंने अपना उत्तर – chalasr

+0

आह अपडेट किया है, हाँ मैंने getQuery() कोशिश की लेकिन यह काम नहीं किया और इसलिए यदि यह निजी है तो यही कारण है। मेरे लिए यह स्पष्ट करने के लिए धन्यवाद। – ruhnet

संबंधित मुद्दे