こんにちは、鈴木です。
Handler で使用する、レスポンスを返すための関数を調べたのでご紹介します。
レスポンスを返すための関数
普通のページであれば「リクエスト → Hadler で処理する → テンプレートがレンダリングされる → レスポンスとして返されて 200 OK!」という順番で処理されますが、Yesod にはレスポンスを返すための便利な関数がいくつか用意されていました。
sendResponse
「200 OK」を返す関数です。
1 2 3 4 5 |
-- 本文が空のレスポンスを返す. getHomeR = sendResponse (typePlain, emptyContent) -- テキストで「OK」を返す. getHomeR = sendResponse $ toTypedContent ("OK" :: Text) |
typePlain は「Content-Type: text/plain」を表すもので、他にも typeHtml や typeJson, typePng などが「yesod-core/Yesod/Core/Content.hs」で定義されていました。
toTypedContent を使うことでコンテンツを返すことができます。動的に生成したコンテンツ(画像など)を返したい場合に活用できそうです。
sendResponseCreated
「201 Created」を返す関数です。
1 |
getHomeR = sendResponseCreated HelloR |
引数に HelloR を指定していますが、これはレスポンスの Location ヘッダで指定される URL に対応します。
redirect
名前の通りリダイレクトを行う関数です。
Yesod のサイトには「クライアントが HTTP/1.1 の場合は 303 See Other を返し、HTTP/1.0 の場合は 302 Found を返す」と書かれていますが、実際に試したところ、どちらでも「303 See Other」が返されました。
1 2 3 4 |
getHomeR 300 = redirect HelloR -- パラメータを指定する場合. getHomeR 301 = redirect (HelloR, [("message", "hello")]) |
invalidArgs
「400 Bad Request」を返す関数です。
1 |
getHomeR 400 = invalidArgs ["無効なリクエストです", "正しいパラメータを指定してください"] |
引数にはリストを指定します。複数のエラーメッセージを指定するために、このようになっているのでしょうか。
notAuthenticated
「401 Unauthorized」を返す関数です。
1 |
getHomeR = notAuthenticated |
permissionDenied
「403 Forbidden」を返す関数です。
1 |
getHomeR 403 = permissionDenied "見せることはできません" |
notFound
「404 Not Found」を返す関数です。
1 |
getHomeR = notFound |
badMethod
「405 Method Not Allowed」を返す関数です。
1 |
getHomeR = badMethod |
sendFile
ファイルをそのまま返す場合に使用する関数です。
1 |
getHomeR = sendFile "text/plain" "static/your-file.txt" |
最初の引数には Content-Type を指定し、二番目の引数にはファイルのパスを指定します。
addHeader
レスポンスヘッダを追加する関数です。
※以前は setHeader という名前でしたが、1.2 から addHeader に変更されています。
1 |
addHeader "X-Hoge" "hoge" |
まとめ
今回は Handler で使用する、レスポンスを返すための関数を調べました。
Yesod のサイトにあるチュートリアルには関数名は書かれているのですが、引数が何かまでは書かれていなかったので苦労しました。