【问题标题】:Perl Net::OAuth problemPerl Net::OAuth 问题
【发布时间】:2010-11-21 05:56:40
【问题描述】:

我正在尝试使用 Net::OAuth 模块通过 Yammer API 进行授权,并且我有以下代码 sn-p,几乎取自 CPAN 上的概要。

$Net::OAuth::PROTOCOL_VERSION = Net::OAuth::PROTOCOL_VERSION_1_0A;
my $q = new CGI;

my $request = Net::OAuth->request("request token")->from_hash($q->Vars,
                request_url => $self->_request_token_url,
                request_method => $q->request_method,
                consumer_secret => $self->consumer_private,
            );

但是如果我尝试运行我的测试,它会抛出如下错误:

Expected a hash! at /Library/Perl/5.8.8/Net/OAuth/Message.pm line 241.

我是否犯了明显的语法错误,还是必须查看 OAuth 模块本身?

【问题讨论】:

    标签: perl oauth


    【解决方案1】:

    Net::OAuth::Message

    sub from_hash {
        my $proto = shift;
        my $class = ref $proto || $proto;
        my $hash = shift;
        if (ref $hash ne 'HASH') {
            die 'Expected a hash!';
        }
        my %api_params = @_;
    

    也许你可以确保 $q->Vars 返回一个哈希引用

    my $vars = $q->Vars;
    print ref($vars);
    

    【讨论】:

      【解决方案2】:

      $q->Vars 在标量上下文中返回哈希引用,在列表上下文中返回扁平哈希。子程序参数创建列表上下文。因此,您应该这样做:

      my $request = Net::OAuth->request("request token")->from_hash(
            scalar $q->Vars,
            request_url => $self->_request_token_url,
            request_method => $q->request_method,
            consumer_secret => $self->consumer_private,
      );
      

      感谢 Adam Bellaire 的评论让我检查了这一点。

      【讨论】:

      • 我一开始也是这么想的,但是不对。看ccheneson链接的源码,只有第一个参数应该是hash引用,其余的都从@_拉到单独的hash中。
      • 此外,哈希构造函数中的元素数量是奇数;)
      • 它不是奇数个元素,因为 $q->Vars 在列表上下文中返回一个扁平化的散列。但这是解决问题的关键。请参阅我编辑的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 2011-07-16
      • 2011-10-01
      • 2011-02-25
      相关资源
      最近更新 更多