RSS

タグ別アーカイブ: Params

Crystal: HTTP/Params

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 に変更すること。

 
コメントする

投稿者: : 2023/10/05 投稿先 Crystal

 

タグ: , ,