我正在使用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 个类(它们不长,我保证):
东西API
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);
好的,现在的问题是,因为我在方法中做了一个var_dump
字段POST
,我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。