使用 GenServer 键值对制作 REST API

Make REST API with GenServer key-value pairs

您好,我不确定如何将我的 genserver 函数传入 Plug.Router

我要构建的查询字符串是:

http://localhost:8000/search/?id=42&value="arabica"

有人告诉我使用:

conn = fetch_query_params(conn)

但不知道如何调用我的 genserver 函数来适应这个

我的 get 宏是这样的:

get "/search/id="{id}<>"&value="{value} do
    send_resp(Server.Database.search(id, value))
end

GenServer 搜索功能:

 def search(bucket, search_list) when is_list(search_list) do
    GenServer.call(bucket, {:search, search_list})
end

如何在 get 宏中插入查询参数并调用我的 genserver 函数?

非常感谢。

您的路由器宏只是为请求匹配提供路径。他们不提取参数(尽管如果你有路径参数,你可以使用 /users/:id 形式)。

然后 Plug.Conn.fetch_query_params/2 不会从 conn 中获取参数,而是解析它们并将它们放入 conn.query_paramsconn.params.

所以您可能希望做更像这样的事情:

get "/search" do
  # make params available on conn
  conn = fetch_query_params(conn)

  # do search on your GenServer
  case Server.Database.search(conn.params["id"], conn.params["value"]) do
    # assuming your GenServer returns this
    {:ok, results} ->
      # JSON encode or whatever you want to do
      send_resp(conn, 200, encode(results))

    # you could handle a wider variety of errors; this is just an example
    {:error, error} ->
      send_resp(conn, 500, encode(error))
  end
end

由于 fetch_query_params/2 本身满足成为插件的要求,您甚至可以将其插入您的管道中:

plug :fetch_query_params

...

get "/search" do
  # conn already has query params
  case ... do
    ...
  end
end