0

Guzzleを使用して、開発中の Web サービスに HTTP POST リクエストを作成しています。

この操作には、次のようなサービス記述 JSON ファイルを使用します。

{
    "name": "My webservice",
    "apiVersion": "1.0",
    "description": "My webservice is a webservice",
    "operations": {
        "createStuff": {
            "httpMethod": "POST",
            "uri": "/stuff/{accountid}/{product}/things",
            "summary": "Creates a thing",
            "parameters": {
                "accountid": {
                    "location": "uri",
                    "description": "The account ID of the stuff"
                },
                "product": {
                    "location": "uri",
                    "description": "The product of the stuff"
                }
            },
            "additionalParameters": {
                "location": "body"
            }
        }
    }
}

作業を行うコードは 2 つのクラスに分割されます (長くはありませんが、約束します)。

スタッフアピ

class StuffApi
{
    protected $client;

    public function __construct(ClientInterface $client, $baseUrl)
    {
        $this->client = $client;

        //tell the client what the base URL to use for the request
        $this->client->setBaseUrl($baseUrl);

        //fill the client with all the routes
        $description = ServiceDescription::factory(__DIR__."/../resources/routes.json");
        $this->client->setDescription($description);
    }

    public function create(StuffEntity $entity)
    {
        $postArray = array('postParam1' => $entity->getPostParam1(), 'postParam2' => $entity->getPostParam2());
        $params = array(
            'parameters' => json_encode($postArray),
            'accountid' => $entity->getAccountId(),
            'product' => $entity->getProduct()
        );

        $response = $this->performCall('createStuff', $params);

        $locationAsArray = $response->getHeader('location')->raw();
        $location = $locationAsArray[0];

        return $location;
    }

    private function performCall($operationName, $parameters)
    {
        $command = $this->client->getCommand($operationName, $parameters);
        $command->prepare();

        $response = $this->client->execute($command);

        return $response;
    }
}

マイサブスクライバー

class MySubscriber implements Symfony\Component\EventDispatcher\EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        return array('request.success' => 'onRequestSuccess');
    }

    public function onRequestSuccess(Event $event)
    {
        var_dump($event['request']->getPostFields());
    }
}

上記のクラスを使用するコードは次のとおりです。

$client = new Guzzle\Service\Client();

$subscriber = new MySubscriber;
$client->addSubscriber($subscriber);

$api = new StuffApi($client, 'http://url.to.webservice.com/');

$x = new StuffEntity();
$x->setAccountId(654143);
$x->setProduct('theproduct');
$x->setPostParam1(1);
$x->setPostParam2('989054MNBNMO5490BMN54');

$result = $api->createStuff($x);

OK、問題は、メソッドvar_dumpPOSTフィールドを実行したため、上記で設定しonRequestSuccessた値が表示されることを期待していたことです。1"989054MNBNMO5490BMN54"

代わりに、私はこれを取得します:

object (Guzzle\Http\QueryString) [35]
    protected 'fieldSeparator' => string '&' (length=1)
    protected 'valueSeparator' => string '=' (length=1)
    protected 'urlEncode' => string 'RFC 3986' (length=8)
    protected 'aggregator' => null
    protected 'data' =>
        array (size=0)
            empty

onRequestSuccessメソッドで、リクエストで使用される POST 情報にアクセスする必要があります。なぜそこにないのですか?それとも、間違った方法で取得しようとしていますか?

前もって感謝します。

PS: 私が使用している Guzzle のバージョンは3.8.1です。

4

0 に答える 0