【问题标题】:Perl JIRA POST error "headers must be presented as a hashref"Perl JIRA POST 错误“标头必须作为 hashref 呈现”
【发布时间】:2017-03-20 13:13:40
【问题描述】:

我正在编写一个 Perl 脚本来发布一个附件到 JIRA 使用 REST::Client 访问API 但我遇到了一个错误。

use REST::Client;

use warnings;
use strict;

use File::Slurp;
use MIME::Base64;

my $user = 'user';
my $pass = 'pass';
my $url  = "http://******/rest/api/2/issue/BugID/attachments";

my $client = REST::Client->new();
$client->addHeader( 'Authorization', 'Basic' . encode_base64( $user . ':' . $pass ) );
$client->addHeader( 'X-Atlassian-Token', 'no-check' );
$client->setHost( $url );

# my %header = ('Authorization' => 'Basic'. encode_base64($user . ':' . $pass),'X-Atlassian-Token' => 'no-check');

my $attachment = "C:\\Folder\\Test.txt";

$client->POST(
    $url,
    'Content_Type' => 'form-data',
    'Content'      => [ 'file' => [$attachment] ]
);

if ( $client->responseCode() eq '200' ) {
    print "Updated\n";
}

# print the result
print $client->responseContent() . "\n";

我得到的错误是

REST::Client 异常:标头必须在 C:\Users\a\filename.pl 第 24 行以 hashref 的形式呈现。

如代码所示,我尝试了不同的方式设置标题,但我仍然得到同样的错误。

如果有其他方法,请建议。

我曾尝试使用 JIRA 模块,但它也会报错。

【问题讨论】:

    标签: perl post jira jira-rest-api


    【解决方案1】:

    根据documentationPOST方法:

    采用自定义请求标头的可选正文内容和 hashref。

    你需要把你的标题放在一个 hashref 中,例如:

    $client->POST($url, $content, {
        foo => 'bar',
        baz => 'qux'
    });
    

    但是...您似乎希望 REST::Client 使用 HTTP::Request::Common 来构造一个多部分/表单数据请求。不幸的是,情况并非如此,因此您必须手动构建内容。

    可以像这样直接使用 HTTP::Request::Common:

    use strict;
    use warnings 'all';
    use 5.010;
    
    use HTTP::Request::Common;
    use REST::Client;
    
    my $client = REST::Client->new;
    my $url = 'http://www.example.com';
    
    my $req = POST($url,
        Content_Type => 'form-data',
        Content      => [ file => [ 'foo.txt' ] ]
    );
    
    $client->POST($url, $req->content(), {
        $req->headers->flatten()
    });
    

    但这有点令人费解;我建议放弃 REST::Client 并改用LWP::UserAgent。 REST::Client 只是 LWP::UserAgent 的一个瘦包装器,具有一些便利功能,例如为所有请求添加默认主机。在这种情况下,它只是碍事,我认为不值得麻烦。

    【讨论】:

      【解决方案2】:

      来自文档:

      POST ($url, [$body_content, %$headers])

      而你正在做:

      $client->POST(
          $url,
          'Content_Type' => 'form-data',
          'Content'      => [ 'file' => [$attachment] ]
      );
      

      所以 - 传递一个标量列表,最后是一个 arrayref。

      也许你想要这样的东西:

      $client->POST(
          $url,
          $attachment,
          { 'Content-Type' => 'form-data' }
      );
      

      注意{} 为标头构造一个匿名散列。

      虽然您可能想要打开并包含“附件”,因为REST::Client 中没有关于打开文件并自动发送它们的内容。

      【讨论】:

      • 该模块本质上是LWP::UserAgentURI 的包装器;我在那里看不到与 REST 有任何关系,而且文档很糟糕。 %$headers 是一种奇怪的方式来指定参数应该是一个哈希引用。我看到有一种方法可以将它正在使用的 LWP::UserAgent 对象交还给它(或者您可以在构造函数中传递您自己的对象),因此您可能可以处理该对象的文件处理,但仅仅 slurp 文件并传递它可能更容易它在对POST 的调用中,或者直接使用LWP
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多