2010-11-16 11 views
23

Nếu bạn cố gắng đăng nhập tại https://orbit.theplanet.com/Login.aspx?url=/Default.aspx (sử dụng kết hợp tên người dùng/mật khẩu), bạn có thể thấy rằng thông tin đăng nhập được gửi dưới dạng tập dữ liệu POST không truyền thống: chỉ là chuỗi JSON đơn lẻ và không có cặp khóa = giá trị bình thường.Làm cách nào để tạo yêu cầu POST JSON với LWP?

Cụ thể, thay vì:

username=foo&password=bar 

hoặc thậm chí một cái gì đó như:

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

Có đơn giản là:

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

Có thể để thực hiện một yêu cầu như vậy với LWP hoặc một mô-đun thay thế? Tôi đã chuẩn bị để làm như vậy với IO::Socket nhưng muốn một cái gì đó cao cấp hơn nếu có.

Trả lời

56

Bạn cần phải xây dựng yêu cầu HTTP theo cách thủ công và chuyển yêu cầu đó tới LWP. Một cái gì đó như sau nên làm điều đó:

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

Sau đó, bạn có thể thực hiện theo yêu cầu với LWP:

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

Chỉ cần tạo một yêu cầu POST với yêu cầu POST đó và gửi cho 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. 
+2

print $ res-> decoded_content nên in đáp ứng được giải mã – kyle

1

Nếu bạn thực sự muốn sử dụng WWW :: mechanize bạn có thể đặt tiêu đề 'content-type 'trước khi đăng

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

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

Trang chỉ sử dụng đầu vào "ẩn danh" (không có tên), có định dạng JSON.

Bạn sẽ có thể sử dụng $ua->post($url, ..., Content => $content), lần lượt sử dụng hàm POST() từ 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()); 
} 

Ngoài ra, bạn cũng có thể sử dụng một băm cho đầu vào JSON:

use JSON::XS qw(encode_json); 

... 

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

... 

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