使用 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_params
和 conn.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
您好,我不确定如何将我的 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_params
和 conn.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