我继承了一个用 Elixir 编写的项目。基本上它是一个 API 网关。在这种情况下,我需要从我的 API Gateway URL 重定向到目标 URL 重定向到的那个。所以情况是这样的。
请求(Elixir 中的 API 网关)> 转到我的服务器,该服务器返回 302 并重定向到另一个 URL。
我写了一些这样的代码:
def index(%{query_string: query_string} = conn, data) do
final_conn =
case MyLib.index(data, [], query_string) do
{:ok, %HTTPoison.Response{status_code: 200, body: body}} ->
conn
|> put_status(200)
|> put_resp_content_type("application/vnd.api+json")
|> json(body)
{:ok, %HTTPoison.Response{status_code: 500, body: body}} ->
conn
|> put_status(500)
|> put_resp_content_type("application/vnd.api+json")
|> json(body)
{:ok, %HTTPoison.Response{status_code: 302, body: body}} ->
conn
|> put_status(302)
|> redirect(to: conn)
|> Plug.Conn.halt()
{:ok, %HTTPoison.Response{status_code: 303, body: body}} ->
conn
|> put_status(303)
|> redirect(to: conn)
|> Plug.Conn.halt()
{:ok, %HTTPoison.Response{status_code: 404}} ->
conn
|> put_status(404)
|> put_resp_content_type("application/vnd.api+json")
|> json(%{error_code: "404", reason_given: "Resource not found."})
{:error, %HTTPoison.Error{reason: reason}} ->
conn
|> put_status(500)
|> put_resp_content_type("application/vnd.api+json")
|> json(%{error_code: "500", reason_given: reason})
end
final_conn
MyLib.index 很简单
def index(conn, headers \\ [], query_string) do
HTTPoison.get(process_url("?#{query_string}"), headers)
end
此代码正确管理错误部分,但我无法使其适用于 301 或 302。
(不用说,我一生中从未见过 Elixir)。