OAuth::fetch

(PECL OAuth >= 0.99.1)

OAuth::fetch获取受 OAuth 保护的资源

描述

public OAuth::fetch(
    string $protected_resource_url,
    array $extra_parameters = ?,
    string $http_method = ?,
    array $http_headers = ?
): mixed

获取资源。

参数

protected_resource_url

受 OAuth 保护的资源的 URL。

extra_parameters

要与资源请求一起发送的额外参数。

http_method

OAUTH_HTTP_METHOD_* OAUTH 常量 之一,包括 GET、POST、PUT、HEAD 或 DELETE。

HEAD (OAUTH_HTTP_METHOD_HEAD) 在请求之前(如果 OAuth 凭据位于 Authorization 标头中)可用于发现信息。

http_headers

HTTP 客户端标头(例如 User-Agent、Accept 等)

返回值

成功时返回 true,失败时返回 false

变更日志

版本 描述
PECL oauth 1.0.0 以前在失败时返回 null,而不是 false
PECL oauth 0.99.5 添加了 http_method 参数
PECL oauth 0.99.8 添加了 http_headers 参数

示例

示例 #1 OAuth::fetch() 示例

<?php
try {
$oauth = new OAuth("consumer_key","consumer_secret",OAUTH_SIG_METHOD_HMACSHA1,OAUTH_AUTH_TYPE_AUTHORIZATION);
$oauth->setToken("access_token","access_token_secret");

$oauth->fetch("http://photos.example.net/photo?file=vacation.jpg");

$response_info = $oauth->getLastResponseInfo();
header("Content-Type: {$response_info["content_type"]}");
echo
$oauth->getLastResponse();
} catch(
OAuthException $E) {
echo
"Exception caught!\n";
echo
"Response: ". $E->lastResponse . "\n";
}
?>

参见

添加注释

用户贡献的注释 6 个注释

3
contact info at mech dot cx
13 年前
我在让 fetch() 进行 POST 时遇到了麻烦,远程服务器(在本例中是 Twitter)抱怨我的请求“资源仅支持 POST”。结果发现是 OAuth 1.1 中的一个已知错误,降级到 1.0 解决了问题。

不要像我一样在这个问题上浪费太多时间 :-)
3
zverik at textual dot ru
10 年前
如果 $extra_parameters 不是数组,则必须指定 Content-Type 标头,否则将收到 HTTP 401 错误。示例

<?php
$oauth
->fetch(ENDPOINT, '{"action": "get_user_info"}', OAUTH_HTTP_METHOD_PUT, array('Content-Type' => 'application/json'));
?>
3
chris dot barr at ntlworld dot com
11 年前
如果返回的 http 状态代码在 4xx 或 5xx 范围内,fetch() 方法将抛出 OAuthException

<?php
// 使用错误的登录信息查询 Twitter
try {
$oauth->fetch('https://api.twitter.com/1.1/favorites/list.json');
}
catch(
Exception $e) {
echo
$e->getCode(); // 401
// OAuth 类生成的错误消息
echo $e->getMessage(); // 无效的身份验证/错误请求(收到 401,预期 HTTP/1.1 20X 或重定向)
// Twitter 返回的错误消息
echo $e->lastResponse; // {"errors":[{"message":"Could not authenticate you","code":32}]}
}
2
sun at drupal dot org
13 年前
确保您的 $extra_parameters 是数组。

如果不是,则 OAuth 将静默跳过格式错误的数据类型,并生成一个无效的签名基本字符串(不包含 POST 参数,如 RFC 中所定义)。

您应该针对您在野外发现的任何接受此类伪造签名的 REST API 提交严重错误报告。
1
Lars Stttrup Nielsen
8 年前
因此我使用它与 Woocommerce REST API 交谈,并且在弄清楚 $extra_parameters 到底应该是什么样子(WC REST API 期望什么,除了类型为 OAUTH_AUTH_TYPE_URI 之外)时遇到了很多麻烦。

我为它提供的多维数组使 PHP 崩溃,所以如果你像我一样,就不要这样做。

最终解决问题的是我查看了 OAuth 源代码,注意到 $extra_parameters 也可以是字符串,该字符串以 json 编码(json_encode)的形式解决了我的所有问题,因为 WC 接受了它。
0
Lyuben Penkovski (l_penkovski at yahoo dot com)
13 年前
如果提供者的 Web 服务器配置为使用 HTTP 协议的 Keep-Alive 扩展(HTTP 1.1),则提供者响应时间可能会有很大延迟。默认情况下,Apache 配置为使用 Keep-Alive 5 秒。这是响应返回给消费者的延迟。如果遇到此延迟结果问题,可以在调用 $consumer->fetch() 时传入 HTTP 标头

<?php
$consumer
= new OAuth("consumer_key", "consumer_secret", OAUTH_SIG_METHOD_HMACSHA1, OAUTH_AUTH_TYPE_FORM);
$consumer->fetch('http://example.com/api/', null, OAUTH_HTTP_METHOD_POST, array('Connection'=>'close'));
?>

然后,提供者将在处理完成后立即发送结果,连接将关闭。不幸的是,在调用 $consumer->getRequestToken() 和 $consumer->getAccessToken() 时,没有提供传入 HTTP 标头的方法,因此无法避免此延迟(如果存在),或者至少我们找不到避免它的方法。

对我们来说,有效的解决方案是在提供者将结果返回给消费者时,从提供者发送此标题。

<?php
$result
= 'oauth_callback_accepted=true&oauth_token=' . $this->urlencode($token->oauth_token) .
'&oauth_token_secret='.$this->urlencode($token->oauth_token_secret);

header('HTTP/1.1 200 OK');
header('Content-Length: '.strlen($result));
header('Content-Type: application/x-www-form-urlencoded');
header('Connection:close');
echo
$result;
?>

如果您有修改提供者代码的可能性,例如您自己就是提供者,或者您可以与开发提供者的人员交谈并要求他们为您的请求发送此标题,那么这将起作用。
To Top