perl LWPを使ってcookie必須のページへのPOSTアクセス

うちで主に携帯向けとして提供しているゲームコンテンツのゲートウェイサービスは、内部でHTTP::Liteを使用して、オフィシャルのコンテンツを取りに行っている。

いままでは、それで問題なく利用できていたのだが、今回の動作状況見直しの際に、1点問題となる場面が見つかった。

それは、以下の様に同じ名前のパラメータで値が異なるものを送らなければならないことがある、ということ。

1<input type="text" name="param" value="value1">
2<input type="text" name="param" value="value2">

HTTP::Liteは、POSTアクセス時のコンテンツのペイロードに連想配列を使うため、同じ名前のものを複数送ることができない。

そんなわけで、LWPを使うように仕様変更を試みた。


HTTP::Liteを使用するもの

1use HTTP::Lite;
2$http = new HTTP::Lite;
3$url="http://~";
4$http->add_req_header("Cookie", "cookiename=$cookie");
5%vars = ( "param" =>; "value1");
6$http->prepare_post(\%vars);
7$req = $http->request("$url")
8    or $flagerr=1;
9$contents=$http->body;

LWP使用に変更したもの

1use LWP::UserAgent;
2use HTTP::Headers;
3use HTTP::Request;
4$lwpua = LWP::UserAgent->new;
5$url="http://~";
6$lwpreq = HTTP::Request->new(POST => $url);
7$lwpreq->content_type('application/x-www-form-urlencoded');
8$lwpreq->header("Cookie"=>"cookiename=$cookie");
9$lwpreq->content("param=value1&param=value2");
10$lwpres= $lwpua->request($lwpreq);
11$contents=$lwpres->as_string;

細かい点はいくつかあるものの、こんな感じで移行はできた。

失敗した点

最初「$lwpreq = HTTP::Request->new(POST => $url);」を「$lwpreq = HTTP::Request->new(POST => ‘$url’);」としていた。
この場合、「400 URL must be absolute」というエラーメッセージが出力されていた。
$urlにつけていたシングルクォーテーションを外したところ、正常動作した。

参考にしたLWP cookbookのサンプルは固定URLであるので、シングルクォーテーションで良いが、変数を使う場合にシングルクォーテーションを使うと駄目、という基本を忘れていたために食らいました。

もう1点、サーバに対して、Cookieの値を送る方法がよくわからなかった。
HTTP::Liteの時の例とかを考え、headerにCookieという名前で値を追加すればいい、と思い当たったので、それでやってみたところ、期待通りに動作した。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.

StatCounter - Free Web Tracker and Counter