我如何在 Elixir 中使用 plug_cowboy 允许 CORS?
How would I allow CORS with plug_cowboy in Elixir?
我正在尝试通过在别处进行 API 调用来访问这些端点,我如何才能为此允许 CORS?我在 localhost:4001 上 运行,并从 localhost:3000 发出 API 调用(反应)。提前致谢。如果您需要任何额外的信息(或文件),请随时询问。
defmodule Api.Endpoint do
@moduledoc """
A plug that parses requests as JSON,
dispatches responses and
makes necessary changes elsewhere.
"""
use Plug.Router
plug Plug.Logger
plug :match
# Using Poison for JSON decoding
plug(Plug.Parsers, parsers: [:json], json_decoder: Poison)
plug :dispatch
get "/ping" do
send_resp(conn, 200, Poison.encode!(%{response: "pong!"}))
end
post "/events" do
{status, body} =
case conn.body_params do
%{"events" => events} -> {200, process_events(events)}
_ -> {422, missing_events()}
end
send_resp(conn, status, body)
end
defp process_events(events) when is_list(events) do
Poison.encode!(%{response: "Received Events!"})
end
defp process_events(_) do
Poison.encode!(%{response: "Please Send Some Events!"})
end
defp missing_events do
Poison.encode!(%{error: "Expected Payload: { 'events': [...] }"})
end
match _ do
send_resp(conn, 404, "oops... Nothing here :(")
end
end
根据@WeezHard 所说,您使用 corsica 编写了类似这样的代码
defmodule Api.CORS do
use Corsica.Router,
origins: ["http://localhost:3000"],
allow_credentials: true,
max_age: 600
resource "/public/*", origins: "*"
resource "/*"
end
然后在您的端点
defmodule Api.Endpoint do
@moduledoc """
A plug that parses requests as JSON,
dispatches responses and
makes necessary changes elsewhere.
"""
use Plug.Router
plug Plug.Logger
plug Api.CORS
...
end
我正在尝试通过在别处进行 API 调用来访问这些端点,我如何才能为此允许 CORS?我在 localhost:4001 上 运行,并从 localhost:3000 发出 API 调用(反应)。提前致谢。如果您需要任何额外的信息(或文件),请随时询问。
defmodule Api.Endpoint do
@moduledoc """
A plug that parses requests as JSON,
dispatches responses and
makes necessary changes elsewhere.
"""
use Plug.Router
plug Plug.Logger
plug :match
# Using Poison for JSON decoding
plug(Plug.Parsers, parsers: [:json], json_decoder: Poison)
plug :dispatch
get "/ping" do
send_resp(conn, 200, Poison.encode!(%{response: "pong!"}))
end
post "/events" do
{status, body} =
case conn.body_params do
%{"events" => events} -> {200, process_events(events)}
_ -> {422, missing_events()}
end
send_resp(conn, status, body)
end
defp process_events(events) when is_list(events) do
Poison.encode!(%{response: "Received Events!"})
end
defp process_events(_) do
Poison.encode!(%{response: "Please Send Some Events!"})
end
defp missing_events do
Poison.encode!(%{error: "Expected Payload: { 'events': [...] }"})
end
match _ do
send_resp(conn, 404, "oops... Nothing here :(")
end
end
根据@WeezHard 所说,您使用 corsica 编写了类似这样的代码
defmodule Api.CORS do
use Corsica.Router,
origins: ["http://localhost:3000"],
allow_credentials: true,
max_age: 600
resource "/public/*", origins: "*"
resource "/*"
end
然后在您的端点
defmodule Api.Endpoint do
@moduledoc """
A plug that parses requests as JSON,
dispatches responses and
makes necessary changes elsewhere.
"""
use Plug.Router
plug Plug.Logger
plug Api.CORS
...
end