2011-06-27
■ [AnyEvent-HTTP][Tatsumaki-HTTPClient][FriendFeed]AnyEvent::HTTPでFrinedFeedにポストしてコケる(未解決->解決 6/28 0:33)

(追記)ブックマークで id:mattn さんから頂いたコメント
_authの最下行の手前に chomp $auth; 入れるときっと動くナリ
をやってみたら、ポスト出来ました。 id:mattn さんありがとうございます!
--
AnyEvent::HTTP(と Tatsumaki::HTTPClient)でFriendFeedに Basic認証付きのポストをしようとするとステータスコード 404 が返ってきて、bodyパラメータが必要ですって言われる!
FriendFeedAPIのドキュメントは「FriendFeed API Documentation」にある。
use strict; use AnyEvent; use AnyEvent::HTTP; use MIME::Base64; use Data::Dumper; my $api = 'http://friendfeed-api.com/v2/entry'; my $cv = AnyEvent->condvar; http_request('POST' => $api, headers => { 'Authorization' => _auth('my username', 'my remotekey') }, body => "body=test", sub { warn Dumper \@_; $cv->send; }, ); $cv->recv; exit 0; sub _auth { my($username, $remote_key) = @_; my $auth = MIME::Base64::encode(join(":", $username, $remote_key)); chomp $auth; # add "Basic $auth"; }
結果: 401が返ってきてないから、Basic認証は通ってるけど、errorCode で "body-required" って言ってるので、リクエストボディに問題があるっぽい。ちなみにFriendfeedAPIではリクエストボディに必ず body パラメータが必要で、それがリクエストボディに記述がないってエラーコードなんだけど、、、リクエストボディの送信ができてないのか、それともリクエストボディの記述が間違いなのか?
$VAR1 = [
'{"errorCode":"body-required"}',
{
'URL' => 'http://friendfeed-api.com/v2/entry',
'connection' => 'close',
'set-cookie' => 'HASFF=1; Path=/,AT=3295780562084656563_1309173742; Path=/',
'Status' => '404',
'HTTPVersion' => '1.1',
'date' => 'Mon, 27 Jun 2011 11:22:22 GMT',
'content-length' => '29',
'Reason' => 'Not Found',
'content-type' => 'text/javascript; charset=UTF-8',
'server' => 'FriendFeedServer/0.1'
}
];
AnyEvent::HTTPのラッパーの Tatsumaki::HTTPClient を使ってみる
my $client = Tatsumaki::HTTPClient->new; my $cv = AnyEvent->condvar; $client->post( $api, [ body => 'TEST' ], Authorization => _auth('my username', 'my remotekey'), sub { warn Dumper shift; $cv->send; } ); $cv->recv; exit 0;
結果: 同じ結果
$VAR1 = bless( {
'_content' => '{"errorCode":"body-required"}',
'_rc' => '404',
'_headers' => bless( {
'connection' => 'close',
'set-cookie' => 'HASFF=1; Path=/,AT=2762172806905182125_1309174542; Path=/',
'date' => 'Mon, 27 Jun 2011 11:35:42 GMT',
'status' => '404',
'reason' => 'Not Found',
'httpversion' => '1.1',
'content-length' => '29',
'content-type' => 'text/javascript; charset=UTF-8',
'url' => bless( do{\(my $o = 'http://friendfeed-api.com/v2/entry')}, 'URI::http' ),
'server' => 'FriendFeedServer/0.1'
}, 'HTTP::Headers' ),
'_msg' => 'Not Found'
}, 'HTTP::Response' );
ちなみに
- LWP::UserAgent を使うとポストできる
- 他のコンテンツへのポストは成功している
トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20110627
MIME::Base64::encode('user:password', '')