Как я могу сделать запрос JSON POST с LWP? - PullRequest
28 голосов
/ 17 ноября 2010

Если вы попытаетесь войти в систему с 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 ]

68 голосов
/ 17 ноября 2010

Вам нужно будет создать 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 );
14 голосов
/ 17 ноября 2010

Просто создайте запрос 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.
9 голосов
/ 04 августа 2015

На странице используется только «анонимный» (без имени) ввод, который происходит в формате 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));
1 голос
/ 10 декабря 2014

Если вы действительно хотите использовать WWW :: Mechanize, вы можете установить заголовок 'content-type' перед публикацией

$mech->add_header( 
'content-type' => 'application/json'
);

$mech->post($uri, Content => $json);
...