PHP oAuth POST请求
让我的oAuth POST请求返回可行的响应有点困难。任何想法都将不胜感激PHP oAuth POST请求,php,oauth-2.0,Php,Oauth 2.0,让我的oAuth POST请求返回可行的响应有点困难。任何想法都将不胜感激 $request = $provider->getAuthenticatedRequest( 'POST', 'https://graph.microsoft.com/v1.0/me/calendar/events', $_SESSION['access_token'], ['body' => json_encode([ 'Id' =&g
$request = $provider->getAuthenticatedRequest(
'POST',
'https://graph.microsoft.com/v1.0/me/calendar/events',
$_SESSION['access_token'],
['body' =>
json_encode([
'Id' => null,
'Subject' => 'Test 54575',
'Start' => [
'DateTime' => '2016-11-17T02:00:00',
'TimeZone' => 'W. Europe Standard Time'
],
'End' => [
'DateTime' => '2016-11-17T04:00:00',
'TimeZone' => 'W. Europe Standard Time'
],
'Body' => [
'ContentType' => 'Text',
'Content' => 'estruyf'
],
'IsReminderOn' => false
])
]
);
$response = $provider->getResponse($request);
错误:
Fatal error: Uncaught UnexpectedValueException: Failed to parse JSON response: Syntax error in C:\projects\agentprocal\vendor\league\oauth2-client\src\Provider\AbstractProvider.php:663 Stack trace: #0 C:\projects\agentprocal\vendor\league\oauth2-client\src\Provider\AbstractProvider.php(704): League\OAuth2\Client\Provider\AbstractProvider->parseJson(NULL) #1 C:\projects\agentprocal\vendor\league\oauth2-client\src\Provider\AbstractProvider.php(643): League\OAuth2\Client\Provider\AbstractProvider->parseResponse(Object(GuzzleHttp\Psr7\Response)) #2 C:\projects\agentprocal\index.php(58): League\OAuth2\Client\Provider\AbstractProvider->getResponse(Object(GuzzleHttp\Psr7\Request)) #3 {main} thrown in C:\projects\agentprocal\vendor\league\oauth2-client\src\Provider\AbstractProvider.php on line 663
我在创建令牌或请求数据方面没有任何问题。如果有人需要进一步的信息,请随时询问。谢谢
(使用“league/oauth2客户端”:“^1.4”)
最后回答正确
问题
我目前正在查看该类AbstractProvider
,在供应商中,您似乎有:
protected function parseJson($content) {
$content = json_decode($content, true);
if (json_last_error() !== JSON_ERROR_NONE) { // ! here that problem occurs
throw new UnexpectedValueException(sprintf(
"Failed to parse JSON response: %s",
json_last_error_msg()
));
}
return $content;
}
这会引发一个异常,表示解析JSON时存在一些问题,因为在另一个函数中,我们有:
protected function parseResponse(ResponseInterface $response) {
$content = (string) $response->getBody();
$type = $this->getContentType($response);
if (strpos($type, 'urlencoded') !== false) { // ! here he checks header
parse_str($content, $parsed);
return $parsed;
}
// Attempt to parse the string as JSON regardless of content type,
// since some providers use non-standard content types. Only throw an
// exception if the JSON could not be parsed when it was expected to.
try {
return $this->parseJson($content);
} catch (UnexpectedValueException $e) { // ! here it catch
if (strpos($type, 'json') !== false) { // ! again he checks header
throw $e; // ! and here it throw
}
return $content;
}
}
解决方案
看起来您没有设置正确的标题。
因此,如果您在请求中添加如下内容:
$options['header']['Content-Type'] = 'application/x-www-form-urlencoded';
它应该可以工作,因为它只会返回一个字符串,而不会在受保护的函数parseJson($content)方法中尝试json\u decode()
在您的代码中,它将如下所示:
$request = $provider->getAuthenticatedRequest(
'POST',
'https://graph.microsoft.com/v1.0/me/calendar/events',
$_SESSION['access_token'],
['body' =>
json_encode([
'Id' => null,
'Subject' => 'Test 54575',
'Start' => [
'DateTime' => '2016-11-17T02:00:00',
'TimeZone' => 'W. Europe Standard Time'
],
'End' => [
'DateTime' => '2016-11-17T04:00:00',
'TimeZone' => 'W. Europe Standard Time'
],
'Body' => [
'ContentType' => 'Text',
'Content' => 'estruyf'
],
'IsReminderOn' => false
]),
'header' => [
'Content-Type' => 'application/x-www-form-urlencoded', // set header
],
],
);
$response = $provider->getResponse($request);
如果您想在JSON中获得响应,您应该将标题设置为:
$options['header']['Accept'] = `application/json`;
$options['header']['Content-Type'] = `application/json`;
在您的代码中,它看起来像:
$request = $provider->getAuthenticatedRequest(
'POST',
'https://graph.microsoft.com/v1.0/me/calendar/events',
$_SESSION['access_token'],
['body' =>
json_encode([
'Id' => null,
'Subject' => 'Test 54575',
'Start' => [
'DateTime' => '2016-11-17T02:00:00',
'TimeZone' => 'W. Europe Standard Time'
],
'End' => [
'DateTime' => '2016-11-17T04:00:00',
'TimeZone' => 'W. Europe Standard Time'
],
'Body' => [
'ContentType' => 'Text',
'Content' => 'estruyf'
],
'IsReminderOn' => false
]),
'header' => [
'Content-Type' => 'application/json', // set content type as JSON
'Accept' => 'application/json', // set what you expect in answer
],
],
);
$response = $provider->getResponse($request);
更新
聊天结束后,我们找到了解决办法。标题有问题,正确的代码是:
$body = [
'Id' => null,
'Subject' => 'Test 54575',
'Start' => [
'DateTime' => '2016-11-17T02:00:00',
'TimeZone' => 'W. Europe Standard Time'
],
'End' => [
'DateTime' => '2016-11-17T04:00:00',
'TimeZone' => 'W. Europe Standard Time'
],
'IsReminderOn' => false
];
$options['body'] = json_encode($body);
$options['headers']['Content-Type'] = 'application/json;charset=UTF-8';
$request = $provider->getAuthenticatedRequest(
'POST',
'https://graph.microsoft.com/v1.0/me/calendar/events',
$_SESSION['access_token'],
$options
);
$response = $provider->getResponse($request);
我想我为你找到了一个解决方案,你只是不设置标题。请检查我的答案并让我知道它是否有效:)我对此很好奇。@KarolGasienica我已经在你的回答中回答了谢谢你的帮助。但似乎得到了完全相同的错误。尝试将这两个标题设置为Jsony的
application/x-www-form-urlencoded
like。您还可以在该供应商函数中尝试一些var\u dump
,以检查其产生问题的原因。例如var\u dump($content)代码>在抛出之前
。并写入其中的内容。切换了头类型,但没有效果,但是在检查抛出响应后,我收到了“写入请求(不包括删除)必须包含内容类型头声明”。在发送请求之前,必须有一种方法设置头。我会检查并尽快回复:)