Guzzle将身体编码为Json,但我想要表单数据

时间:2015-05-23 09:15:36

标签: php guzzle

我想发布一些内容到Googles oAuth server进行一些身份验证。 Google确实希望在表单数据(Content-Type: application/x-www-form-urlencoded)中使用此信息,但我的客户端似乎坚持(据我所知)制作正文JSON。我正在使用Guzzle 4。*

我已将我的网址更改为PostCatcher.io url,因此我可以看到结果是什么(因为我的生活中我无法弄清楚如何查看实际的原始HTTP请求,以免吐出来) ,它看起来像是JSON出来了。

我的代码(我现在正在使用测试网址):

$client = new GuzzleClient();
$url = "https://www.googleapis.com/" . "oauth2/v3/token";
$test_url = 'http://postcatcher.in/catchers/55602457b92ce203000032ae';

$request = $client->createRequest('POST', $test_url);
$request->setHeader('Content-Type', 'application/x-www-form-urlencoded'); //should be redundant

$body = $request->getBody();
$body->setField('code', $code);
$body->setField('client_id', $this->client_id);
$body->setField('client_secret', $this->client_secret);
$body->setField('redirect_url', $this->redicrect_url);
$body->setField('grant_type', $this->grant_type);

try {
    $response = $client->send($request);

    $result = $response->getBody();

    return $result;

} catch (\Exception $exc) {
    return $exc->getCode() . ' ' . $exc->getMessage();
}
  

文档说这应该足够了。我错过了什么?

2 个答案:

答案 0 :(得分:1)

使用Guzzle 5.2我做过同样的事情:

$request = $this->createRequest(
    $method,
    $uri,
    ['body' => $php_array_of_values ]
);

$response = $this->send($request);

答案 1 :(得分:0)

我发现了问题。我确实升级到了Guzzle 5. *我怀疑这实际上并不是解决方案。

我只是想看一下回复内容。所以在我添加的调用的例外条款中:

if ($exc->hasResponse()) {
   return $exc->getResponse()->json();
}

这给了我一条来自Google的明确错误消息。错误消息是“Missing parameter:redirect_uri”。那是因为我写了url而不是uri

修正了,现在一切都很好。