HaskellでHTTPリクエスト送信(1)
HaskellでのHTTPリクエスト送信について調べたことメモ。
このへんのページを参考に
"HaskellでHTTP"
http://d.hatena.ne.jp/kenkov/20110430/1304162021
"HaskellでOAuthとTwitter API"
http://d.hatena.ne.jp/kenkov/20110503/1304441705
"Haskell で OAuth"
http://d.hatena.ne.jp/kenkov/20110503/1304441705
hackage
Network.Browser
http://hackage.haskell.org/packages/archive/HTTP/4000.0.8/doc/html/Network-Browser.html
Network.HTTP
http://hackage.haskell.org/packages/archive/HTTP/4000.0.8/doc/html/Network-HTTP.html
Network.URI
http://hackage.haskell.org/packages/archive/network/2.1.0.0/doc/html/Network-URI.html
ただHTTP Requestを生成するだけならNetwork.HTTPに関数が用意されています。
・GETリクエスト生成
getRequest :: String -> Request_String
・使用例
・Output
GET http://www.google.co.jp/ HTTP/1.1 Content-Length: 0 User-Agent: **********
リクエスト先URIを受け取って、request bodyなしのGETリクエストを生成する関数。
URIの形式が文法的におかしい(isn't a syntactically valid URL)ときはerrorを吐くらしい。
・POSTリクエスト生成
postRequest :: String -> Request_String
上の関数のPOSTリクエスト版。
このような関数もあるんですが、OAuthにアクセスするためにAuthorizationヘッダにパラメータを設定して云々とかやるんなら、普通にRequest型の各フィールドに値を設定したほうが良さそうな気がします。
type Request_String = Request String
data Request a = Request { rqURI :: URI , rqMethod :: RequestMethod , rqHeaders :: [Header] , rqBody :: a }
rqURI、rqMethod,rqHeaders,rqBodyに対応する値を突っ込んでいけばいいわけです。
とりあえずBodyは置いとくとして、MethodはだいたいMethod名そのまんまの値(GET,POSTなど)がRequestMethod型に用意されていますので、これを入れればいいっぽいです。
残る問題はURI型とHeader型の値の生成。
・URI型の値生成
parseURI :: String -> Maybe URI
URIの文字列を受け取って、正常にパースできる形式のURIならJustに対応するURI型の値をくるんで渡す関数。 もちろんパースエラーならNothingで返ってきます。
・Header型の値の生成
mkHeader :: HeaderName -> String -> Header
HeaderName型は、各種ヘッダ名の頭に"Hdr"がついた値が用意されています。Authorizationなら HdrAuthorization :: HeaderName を使えばOK。
第2引数にヘッダの内容をStringで与えるとHeader型の値が生成できます。
とりあえずパラメータは置いといて、空のAuthorizationヘッダを持ったリクエストトークン取得のためのHTTPリクエストのヘッダはこんな感じになるハズ……
・Output
POST https://api.twitter.com/oauth/request_token HTTP/1.1 Authorization: OAuth
(わざわざIOで包んでるのは、パラメタにタイムスタンプと乱数を使う場面があるからで、現時点では意味は無いです。)