我正在编写一个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模块但也出错了。
答案 0 :(得分:2)
根据documentation,POST
方法:
采用自定义请求标头的可选正文内容和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
中没有关于打开文件和自动发送文件的内容。