0

我继承了一个用 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)。

4

1 回答 1

0

感谢评论,我尝试了不同的方法。我继承的项目对某些端点有很多特定的定制,在这种情况下我不需要它们中的任何一个。因此,我需要的唯一代码如下:

def index(%{query_string: query_string} = conn, data) do
    redirect(conn, external: process_url("?#{query_string}"))
end

谢谢大家的支持。

于 2020-11-16T10:16:12.453 回答