web-dev-qa-db-ja.com

LWPでJSON POSTリクエストを作成するにはどうすればよいですか?

https://orbit.theplanet.com/Login.aspx?url=/Default.aspx (ユーザー名/パスワードの組み合わせを使用)でログインしようとすると、ログイン資格情報がPOST data:寂しいJSON文字列であり、通常のkey = valueペアはありません。

具体的には、次の代わりに:

username=foo&password=bar

または次のようなものでも:

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

単純にあります:

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

LWPまたは代替モジュールを使用してそのような要求を実行することは可能ですか?私はIO::Socketでそうする準備ができていますが、可能であればより高レベルのものを好むでしょう。

28
Richard Simões

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

それを本体として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.
14
hobbs

このページは、「匿名化された」(名前なし)入力を使用していますが、これはたまたま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));
9
Paolo Rovelli

WWW :: Mechanizeを本当に使用したい場合は、投稿する前にヘッダー 'content-type'を設定できます

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

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