うちで主に携帯向けとして提供しているゲームコンテンツのゲートウェイサービスは、内部でHTTP::Liteを使用して、オフィシャルのコンテンツを取りに行っている。
いままでは、それで問題なく利用できていたのだが、今回の動作状況見直しの際に、1点問題となる場面が見つかった。
それは、以下の様に同じ名前のパラメータで値が異なるものを送らなければならないことがある、ということ。
<input type="text" name="param" value="value1"> <input type="text" name="param" value="value2">
HTTP::Liteは、POSTアクセス時のコンテンツのペイロードに連想配列を使うため、同じ名前のものを複数送ることができない。
そんなわけで、LWPを使うように仕様変更を試みた。
HTTP::Liteを使用するもの
use HTTP::Lite; $http = new HTTP::Lite; $url="http://~"; $http->add_req_header("Cookie", "cookiename=$cookie"); %vars = ( "param" =>; "value1"); $http->prepare_post(\%vars); $req = $http->request("$url") or $flagerr=1; $contents=$http->body;
LWP使用に変更したもの
use LWP::UserAgent; use HTTP::Headers; use HTTP::Request; $lwpua = LWP::UserAgent->new; $url="http://~"; $lwpreq = HTTP::Request->new(POST => $url); $lwpreq->content_type('application/x-www-form-urlencoded'); $lwpreq->header("Cookie"=>"cookiename=$cookie"); $lwpreq->content("param=value1&param=value2"); $lwpres= $lwpua->request($lwpreq); $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という名前で値を追加すればいい、と思い当たったので、それでやってみたところ、期待通りに動作した。