web-dev-qa-db-fra.com

Comment puis-je faire une demande JSON POST avec LWP?

Si vous essayez de vous connecter sur https://orbit.theplanet.com/Login.aspx?url=/Default.aspx (utilisez n'importe quelle combinaison nom d'utilisateur/mot de passe), vous pouvez voir que les informations de connexion sont envoyé comme un ensemble non traditionnel de données POST: juste une chaîne JSON solitaire et pas de paire clé = valeur normale.

Plus précisément, au lieu de:

username=foo&password=bar

ou même quelque chose comme:

json={"username":"foo","password":"bar"}

Il y a simplement:

{"username":"foo","password":"bar"}

Est-il possible d'effectuer une telle requête avec LWP ou un module alternatif? Je suis prêt à le faire avec IO::Socket mais préférerait quelque chose de plus haut niveau si disponible.

28
Richard Simões

Vous devrez construire la demande HTTP manuellement et la transmettre à LWP. Quelque chose comme ce qui suit devrait le faire:

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 );

Ensuite, vous pouvez exécuter la demande avec LWP:

my $lwp = LWP::UserAgent->new;
$lwp->request( $req );
68
friedo

Créez simplement une demande POST avec cela comme corps et donnez-la à 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.
14
hobbs

La page utilise simplement une entrée "anonyme" (sans nom), qui se trouve être au format JSON.

Vous devriez pouvoir utiliser $ ua-> post ($ url, ..., Content => $ content) , qui à son tour utilise la fonction POST () de 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());
}

Alternativement, vous pouvez également utiliser un hachage pour l'entrée JSON:

use JSON::XS qw(encode_json);

...

my %json;
$json{username} = "foo";
$json{password} = "bar";

...

$response = $ua->post($url, Content => encode_json(\%json));
9
Paolo Rovelli

Si vous voulez vraiment utiliser WWW :: Mechanize, vous pouvez définir l'en-tête 'content-type' avant de poster

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

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