How can I make a JSON POST request with LWP?

后端 未结 4 1768
说谎
说谎 2020-12-12 21:03

If you try to login at https://orbit.theplanet.com/Login.aspx?url=/Default.aspx (use any username/password combination), you can see that the login credentials are sent as a

相关标签:
4条回答
  • 2020-12-12 21:36

    The page is just using an "anonymized" (without name) input, which happens to be in JSON format.

    You should be able to use $ua->post($url, ..., Content => $content), which in turn use the POST() function from 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());
    }
    

    Alternatively, you can also use an hash for the JSON input:

    use JSON::XS qw(encode_json);
    
    ...
    
    my %json;
    $json{username} = "foo";
    $json{password} = "bar";
    
    ...
    
    $response = $ua->post($url, Content => encode_json(\%json));
    
    0 讨论(0)
  • 2020-12-12 21:49

    If you really want to use WWW::Mechanize you can set the header 'content-type' before post

    $mech->add_header( 
    'content-type' => 'application/json'
    );
    
    $mech->post($uri, Content => $json);
    
    0 讨论(0)
  • 2020-12-12 21:52

    You'll need to construct the HTTP request manually and pass that to LWP. Something like the following should do it:

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

    Then you can execute the request with LWP:

    my $lwp = LWP::UserAgent->new;
    $lwp->request( $req );
    
    0 讨论(0)
  • 2020-12-12 21:54

    Just create a POST request with that as the body, and give it to 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.
    
    0 讨论(0)
提交回复
热议问题