perl - tarda - foia form
¿Cómo puedo hacer una solicitud JSON POST con LWP? (4)
Deberá construir la solicitud HTTP manualmente y pasarla a LWP. Algo como lo siguiente debería hacerlo:
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 );
Luego puede ejecutar la solicitud con LWP:
my $lwp = LWP::UserAgent->new;
$lwp->request( $req );
Si intenta iniciar sesión en https://orbit.theplanet.com/Login.aspx?url=/Default.aspx (use cualquier combinación de nombre de usuario / contraseña), puede ver que las credenciales de inicio de sesión se envían como un conjunto no tradicional de datos POST: solo una cadena JSON solitaria y ningún par clave = valor normal.
Específicamente, en lugar de:
username=foo&password=bar
o incluso algo así como:
json={"username":"foo","password":"bar"}
Simplemente hay:
{"username":"foo","password":"bar"}
¿Es posible realizar una solicitud de este tipo con LWP
o un módulo alternativo? Estoy preparado para hacerlo con IO::Socket
pero preferiría algo más de alto nivel si estuviera disponible.
La página solo usa una entrada "anónima" (sin nombre), que pasa a estar en formato JSON.
Debería poder usar $ ua-> post ($ url, ..., Contenido => $ contenido) , que a su vez usa la función 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());
}
Alternativamente, también puede usar un hash para la entrada JSON:
use JSON::XS qw(encode_json);
...
my %json;
$json{username} = "foo";
$json{password} = "bar";
...
$response = $ua->post($url, Content => encode_json(/%json));
Si realmente quieres usar WWW :: Mechanize puedes establecer el encabezado ''content-type'' antes de publicar
$mech->add_header(
''content-type'' => ''application/json''
);
$mech->post($uri, Content => $json);
Simplemente crea una solicitud POST con eso como cuerpo y dáselo a 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.