피닉스의 REST API
요구 사항:
$ elixir -v
Elixir 1.13.2 (compiled with Erlang/OTP 24)
$ mix phx.new --version
Phoenix installer v1.6.10
시작하기
다음 명령을 사용하여 프로젝트 생성부터 시작하겠습니다.
$ mix phx.new myApp --no-html --no-assets --no-mailer --no-dashboard --no-ecto
This will remove all the useless boilerplate for us - since APis do not need any HTML or CSS.
이제 폴더로의 경로를 허용합니다.
$ cd myApp
먼저 라우터
lib/myapp_web/router.ex
를 열고 다음 코드를 추가합니다.get "/random", RandomController, :index
라우터는 이제 다음과 같아야 합니다.
defmodule MyAppWeb.Router do
use MyAppWeb, :router
pipeline :api do
plug :accepts, ["json"]
end
# localhost:4000/api/{route}
scope "/api", MyAppWeb do
pipe_through :api
get "/random", RandomController, :index
end
end
커스텀 컨트롤러
라우터에 정의된 대로 이제
RandomController
라는 컨트롤러가 필요합니다.이를 위해
controllers
( lib/myapp_web/controllers
) 폴더를 열고 random_controller.ex
라는 새 파일을 만듭니다.defmodule MyAppWeb.RandomController do
use MyAppWeb, :controller
def index(conn, _params) do
send_resp(conn, 200, "hello world")
end
end
이 파일을 저장하고 이제 서버를 시작하십시오.
$ mix phx.server
서버가
http://localhost:4000/api/random
에서 수신 중이어야 합니다. 선호하는 브라우저에 해당 URL을 입력해 보십시오. 이제 "hello world"
를 볼 수 있습니다 😁.사용자 지정 파일
컨트롤러에 함수를 직접 작성하는 것은 좋지 않습니다. 특히 더 큰 프로젝트에서는 더욱 그렇습니다. 따라서 우리를 위해 모든 것을 처리하는 도우미 함수를 작성해 보겠습니다.
helper
경로를 사용하여 lib/myapp/helper
라는 폴더를 만듭니다.이것은 웹과 관련이 없기 때문에 이제 기본 폴더(
myapp_web
가 아닌)를 사용합니다.해당 폴더에서
random.ex
라는 파일을 만듭니다.다음과 같아야 합니다.
defmodule MyApp.Random do
def random_number do
Enum.random(100..10000)
end
end
좋습니다. 이제
random_controller.ex
로 돌아가서 약간 수정해 보겠습니다.우선, 해당 기능과 함께 새 도우미 파일을 가져옵니다.
import MyApp.Random
그런 다음 "hello world"응답을 함수 이름
random_number()
으로 바꿉니다.이와 같이:
send_resp(conn, 200, random_number())
.random_controller.ex
는 이제 다음과 같아야 합니다.defmodule MyAppWeb.RandomController do
use MyAppWeb, :controller
import MyApp.Random
def index(conn, _params) do
send_resp(conn, 200, random_number())
end
end
파일을 저장하고 서버를 다시 시작하십시오.
$ mix phx.server
다음 URL로 이동:
http://localhost:4000/api/random
이제 페이지를 새로 고치거나 페이지에 들어갈 때마다 임의의 숫자가 표시됩니다. 🎉CORS 처리
이것은 보다 심층적인 주제이지만 다른 사람이 API를 사용하거나 다른 포트/ip에서 자신의 API를 호출하도록 하려면 필요합니다.
이를 위해
corsica
라는 라이브러리를 사용할 것입니다. 루트 디렉토리에서 mix.exs
파일을 열어 설치하겠습니다.deps
함수에 다음 줄을 추가합니다.{:corsica, "~> 1.2"}
귀하의 mix.exs는 이제 다음과 같아야 합니다.
defmodule MyApp.MixProject do
use Mix.Project
def project do
[
app: :myapp,
version: "0.1.0",
elixir: "~> 1.13",
description: "An example Web APi",
elixirc_paths: elixirc_paths(Mix.env()),
compilers: Mix.compilers(),
start_permanent: Mix.env() == :prod,
aliases: aliases(),
deps: deps(),
author: "github.com/vKxni",
docs: [
main: "readme",
extras: [
"README.md"
]
]
]
end
def application do
[
mod: {MyApp.Application, []},
extra_applications: [:logger, :runtime_tools]
]
end
defp elixirc_paths(:test), do: ["lib", "test/support"]
defp elixirc_paths(_), do: ["lib"]
# Here !! :)
defp deps do
[
# phoenix server
{:phoenix, "~> 1.6.10"},
{:telemetry_metrics, "~> 0.6"},
{:telemetry_poller, "~> 1.0"},
{:gettext, "~> 0.18"},
{:plug_cowboy, "~> 2.5"},
{:poison, "~> 5.0"},
{:jason, "~> 1.3"},
# add this line here
{:corsica, "~> 1.2"} # <--
]
end
defp aliases do
[
setup: ["deps.get"]
]
end
end
완료되면 다음 명령을 실행하십시오.
$ mix deps.get
연결에 따라 다소 시간이 걸릴 수 있습니다.
끝점에 CORS 추가
endpoint.exs
폴더에서 myapp_web
라는 파일을 엽니다.(
lib/myapp_web/endpoint.exs
)이제 엔드포인트에서 다음 행을 추가하십시오.
plug(Corsica,
max_age: 600,
origins: "*",
allow_headers: ["accept", "content-type", "authorization"],
allow_methods: ["GET", "POST"],
allow_credentials: true,
log: [rejected: :error, invalid: :warn, accepted: :debug]
)
endpoint.exs
는 이제 다음과 같이 표시됩니다.defmodule MyAppWeb.Endpoint do
use Phoenix.Endpoint, otp_app: :xadara
@session_options [
store: :cookie,
key: "_myapp_key",
signing_salt: "g10HT1jr"
]
# our CORS config starts here
plug(Corsica,
max_age: 600,
origins: "*",
allow_headers: ["accept", "content-type", "authorization"],
allow_methods: ["GET", "POST"],
allow_credentials: true,
log: [rejected: :error, invalid: :warn, accepted: :debug]
)
# CORS ends here
plug Plug.Static,
at: "/",
from: :myapp,
gzip: false,
only: ~w(assets fonts images favicon.ico robots.txt)
if code_reloading? do
plug Phoenix.CodeReloader
end
plug Plug.RequestId
plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint]
plug Plug.Parsers,
parsers: [:urlencoded, :multipart, :json],
pass: ["*/*"],
json_decoder: Phoenix.json_library()
plug Plug.MethodOverride
plug Plug.Head
plug Plug.Session, @session_options
plug MyAppWeb.Router # this here is important too
end
뭔가 조금 다르게 보이더라도 걱정하지 마세요.
session_options
바로 아래에 새 PLUG를 추가하면 됩니다.그리고 끝났습니다! 축하합니다.
Reference
이 문제에 관하여(피닉스의 REST API), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/vkxni/rest-api-in-phoenix-3o3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)