Как я могу сделать запрос JSON POST с LWP?
если вы пытаетесь войти в https://orbit.theplanet.com/Login.aspx?url=/Default.aspx (Используйте любую комбинацию имени пользователя / пароля), вы можете видеть, что учетные данные для входа отправляются как нетрадиционный набор данных POST: просто одинокая строка JSON и нет нормальной пары ключ=значение.
в частности, вместо:
username=foo&password=bar
или даже что-то вроде:
json={"username":"foo","password":"bar"}
просто:
{"username":"foo","password":"bar"}
возможно ли выполнить такой запрос с LWP
или альтернативный модуль? Я готов сделать это с IO::Socket
но предпочитаете что-то более высокого уровня, если таковые имеются.
4 ответов
вам нужно будет создать 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 );
просто создайте запрос 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.
страница просто использует "анонимизированный" (без имени) ввод, который находится в формате JSON.
вы должны иметь возможность использовать $ua - >post ($url, ..., Content = > $content), которые в свою очередь используют функцию POST () из HTTP::Request::Common.
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));
Если вы действительно хотите использовать WWW:: Mechanize вы можете установить заголовок "content-type" перед post
$mech->add_header(
'content-type' => 'application/json'
);
$mech->post($uri, Content => $json);