如果您尝试登录https://orbit.theplanet.com/Login.aspx?url=/Default.aspx(使用任何用户名/密码组合),您可以看到登录凭据是作为非传统的POST数据集发送的:只是一个寂寞的JSON字符串而且没有正常key = value pair。
具体而言,而不是:
username=foo&password=bar
甚至是:
json={"username":"foo","password":"bar"}
简单地说:
{"username":"foo","password":"bar"}
是否可以使用LWP
或替代模块执行此类请求?我准备与IO::Socket
这样做,但如果可用,我会更喜欢更高级别的内容。
答案 0 :(得分:68)
您需要手动构建HTTP请求并将其传递给LWP。像下面这样的东西应该这样做:
my $uri = 'https://orbit.theplanet.com/Login.aspx?url=/Default.aspx';
my $json = '{"username":"foo","password":"bar"}';
my $req = HTTP::Request->new( 'POST', $uri );
$req->header( 'Content-Type' => 'application/json' );
$req->content( $json );
然后你可以用LWP执行请求:
my $lwp = LWP::UserAgent->new;
$lwp->request( $req );
答案 1 :(得分:14)
只需创建一个POST请求,并将其作为正文,并将其提供给LWP。
my $req = HTTP::Request->new(POST => $url);
$req->content_type('application/json');
$req->content($json);
my $ua = LWP::UserAgent->new; # You might want some options here
my $res = $ua->request($req);
# $res is an HTTP::Response, see the usual LWP docs.
答案 2 :(得分:9)
该页面只是使用“匿名”(无名称)输入,恰好是JSON格式。
您应该可以使用$ua->post($url, ..., Content => $content),而HTTP::Request::Common会使用https://github.com/iamthiago/cassandra-phantom中的POST()函数。
use LWP::UserAgent;
my $url = 'https://orbit.theplanet.com/Login.aspx?url=/Default.aspx';
my $json = '{"username": "foo", "password": "bar"}';
my $ua = new LWP::UserAgent();
$response = $ua->post($url, Content => $json);
if ( $response->is_success() ) {
print("SUCCESSFUL LOGIN!\n");
}
else {
print("ERROR: " . $response->status_line());
}
或者,您也可以使用哈希作为JSON输入:
use JSON::XS qw(encode_json);
...
my %json;
$json{username} = "foo";
$json{password} = "bar";
...
$response = $ua->post($url, Content => encode_json(\%json));
答案 3 :(得分:1)
如果您真的想使用WWW :: Mechanize,可以设置标题' content-type'发布之前
$mech->add_header(
'content-type' => 'application/json'
);
$mech->post($uri, Content => $json);