HTTP/Params はクライアントからのリクエストのパラメータを表す。GET メソッドで言えば URL の ? 以降の部分に当たる。
実は、HTTP / Params は URI / Params の別名である。
実際のパラメータを取得するには Request.query_params にアクセスすることにより簡単にリクエストパラメータを取得できる。
Request.query_params の型は URI::Params であり、HTTP サーバがリクエストがあるとパラメータを解析して、この Request.query_params に値を入れてくれる。
URI::Params は Enumerable({String, String}) を含んでいるので、ハッシュ (連想配列) としても扱うことができる。
要するに、パラメータのキーが key のとき、その値は次のようにして取得できる。
value = query_params[key]
キーが存在しない場合もあるので、その時は fetch(key, default) メソッドを使うほうが便利である。このメソッドを使えば、キーが存在しない時は、デフォルト値を返してくれる。
次に、URI:: Params の使用例を示す。
# HTTP/Params https://crystal-lang.org/api/1.9.2/URI/Params.html
require "http/server"
server = HTTP::Server.new do |context|
req = context.request
res = context.response
res.content_type = "text/plain"
if req.path == "/echo"
res.puts req.query # QUERY_STRING の内容
res.puts req.query_params["message"] # リクエストパラメータの値を得る。(エコーする)
if req.query_params["A"]?.nil? # パラメータがあるか確認 (has_key? のほうが良いが)
puts "params[A] = Nil"
else
puts req.query_params["A"]
end
elsif req.path == "/fetch"
res.puts req.query_params.fetch("A", "Default_A") # リクエストパラメータがない場合、デフォルト値を返す。
else
res.status = HTTP::Status::NOT_FOUND
res.puts "Not Found\n"
end
end
address = server.bind_tcp 8080
puts "Listening on http://#{address}"
server.listen
(注意) POST メソッドの場合は、req.query_params でなく req.form_params に変更すること。