HaskellでTwitterクライアント開発blog(仮)

今すぐに挫折するかもしれない程度のモチベーションによるTwitterクライアント開発記

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で包んでるのは、パラメタにタイムスタンプと乱数を使う場面があるからで、現時点では意味は無いです。)