2

所以现在我正在使用 REST::Client,它在发出 GET 请求和获取 JSON 数据方面做得非常好。但是,有问题的 API 在发出 POST 请求时应传递 CSRF 令牌和会话 ID,然后如果通过 JSON 输入正确的凭据,则应进一步用于所有 POST 请求。

问题是,我看不到使用 REST::CLient 获取 cookie 的方法,所以我尝试了 LWP,我能够执行 JSON 请求,设置 cookie 设置,但仍然没有 cookie。

我尝试将它存储在一个文件中,尝试在一个变量中,仍然没有

$mech->cookie_jar($cookies);

那么我如何获得这些cookies呢?

PS我确定请求已执行,因为我看到了正确的输出并且我看到了第三方休息客户端的cookie。

编辑:

#!/usr/bin/perl

use REST::Client;
use JSON;
use Data::Dumper;
use MIME::Base64;
use 5.010;
use LWP::UserAgent;
use HTTP::Cookies;

my $first = $ARGV[0];

my $username = 'user@user.com';
my $password = 'password';
my $cookies = HTTP::Cookies->new();
my $ua = LWP::UserAgent->new( cookie_jar => $cookies );
my $headers = {Content-type => 'application/json'};
my $client = REST::Client->new( { useragent => $ua });

my $res = $client->POST('https://URL/action/?do=login', 
'{"username": "user@user.com", "password":"password"}', {"Content-type" => 'application/json'});

chkerr($client->responseCode());

print $client->responseContent();
#print $client->responseHeaders();

#$cookies->extract_cookies($res);

print "\n" . $cookies->as_string;

sub chkerr {
    my $res = shift;
    if($res eq '200') {
        print "Success\n";
    } else { print "API Call failed: $res\n";
#exit(1);
}

}

代码真的很脏,因为我现在已经尝试了大约 50 种不同的东西。

输出如下:

Success
true         -> this indicated that login is successful
Set-Cookie3: __cfduid=d3507306fc7b69798730649577c267a2b1369379851; path="/";  domain=.domain.com; path_spec; expires="2019-12-23 23:50:00Z"; version=0
4

2 回答 2

4

文档来看,似乎REST::Client是在内部使用LWP::UserAgent。默认情况下,除非您设置其属性,LWP::UserAgent否则忽略 cookie 。cookie_jar

所以你可以做这样的事情(未经测试的代码):

my $ua = LWP::UserAgent->new( cookie_jar => {} );
my $rc = REST::Client->new( { useragent => $ua } );
于 2013-05-23T13:04:31.103 回答
0

虽然 innaM 的回答会起作用,但这对我来说似乎更直接:

$client->getUseragent()->cookie_jar({}); # empty internal cookie jar

这假设您已经REST::Client$client.

于 2016-07-14T15:10:07.000 回答