Perl JIRA POST错误“标头必须显示为hashref”

时间:2017-03-20 13:13:40

标签: perl post jira jira-rest-api

我正在编写一个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模块但也出错了。

2 个答案:

答案 0 :(得分:2)

根据documentationPOST方法:

  

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

您需要将标头放在hashref中,例如:

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

但是......看起来你希望REST :: Client使用HTTP::Request::Common来构建multipart / form-data请求。不幸的是,情况并非如此,因此您必须手动构建内容。

可以直接使用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的一个瘦包装器,具有一些便利功能,例如在所有请求之前添加默认主机。在这种情况下,它只是妨碍了我并不认为便利是值得的。

答案 1 :(得分:0)

来自文档:

  

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中没有关于打开文件和自动发送文件的内容。