Phoenix를 사용한 GPS Logging System4 API 설치
14790 단어 Elixirfukuoka.exPhoenix
이것은 혼자만의 LiveView Advent Calendar의 네 번째 날의 문장이다
이 글은 Elixir Conf US 2021 시스템의 구축과 관련 기술에 대한 해설을 목적으로 한 글이다
이번에는 다음과 같은 4가지를 실시한다.
다음 명령을 사용하여 API, 모델, 조회를 만들고 첫날 px를 사용합니다.젠라이브에서 했으니까.
-- no-schema-no-context에서 API만 제작
mix phx.gen.json Loggers Map maps name:string description:string --no-schema --no-context
* creating lib/live_logger_web/controllers/map_controller.ex
* creating lib/live_logger_web/views/map_view.ex
* creating test/live_logger_web/controllers/map_controller_test.exs
* creating lib/live_logger_web/views/changeset_view.ex
* creating lib/live_logger_web/controllers/fallback_controller.ex
Add the resource to your :api scope in lib/live_logger_web/router.ex:
resources "/maps", MapController, except: [:new, :edit]
만들어진 파일들을 한번 보도록 하겠습니다.CRUD API
API의 응답 controller와view 파일이 한 세트라는 것을 잊지 마세요
action_fallback에서 지정한 모든 API 오류 시 fallback -controller 오류 처리
422 error 시 응답 기록
시험도 자동으로 생성됩니다
모형 단일체만 만들고 싶을 때 px.gen.schema 실행
검색어를 만들려면 phx를 사용하십시오.gen.context
mix phx.gen.schema Loggers.Point points lat:float lng:float device_id:string map_id:references:maps
mix ecto.migrate
모델 파일 및 마이그레이션 파일만 생성* creating lib/live_logger/loggers/point.ex
* creating priv/repo/migrations/20211204133145_create_points.exs
Remember to update your repository by running migrations:
$ mix ecto.migrate
잊지 마세요.mix ecto.migrate
로그에 Point 질의 추가Alias에서 Point에서 구조체를 호출할 수 있습니다
list,create 구현
query 함수에서 외부 파라미터를 사용할 때 원시 형식의 인발 연산자를 사용해야 합니다
create는 create입니다.맵을 참고해서 쓰세요.
lib/live_logger/loggers.ex
defmodule LiveLogger.Loggers do
...
alias LiveLogger.Loggers.Point
...
def list_points(map_id) do
Point
|> where([p], p.map_id == ^map_id)
|> Repo.all
end
def create_point(attrs \\ %{}) do
%Point{}
|> Point.changeset(attrs)
|> Repo.insert
end
end
관계를 맺어야 돼요.lib/live_logger/loggers/map.ex
defmodule LiveLogger.Loggers.Map do
use Ecto.Schema
import Ecto.Changeset
schema "maps" do
field :description, :string
field :name, :string
belongs_to :user, LiveLogger.Accounts.User
has_many :points, LiveLogger.Loggers.Point
timestamps()
end
...
end
lib/live_logger/loggers/point.exdefmodule LiveLogger.Loggers.Point do
use Ecto.Schema
import Ecto.Changeset
schema "points" do
field :device_id, :string
field :lat, :float
field :lng, :float
belongs_to :map, LiveLogger.Loggers.Map #field map_idを belongs_toに変更
timestamps()
end
@doc false
def changeset(point, attrs) do
point
|> cast(attrs, [:lat, :lng, :device_id, :map_id]) # map_id追加
|> validate_required([:lat, :lng, :device_id, :map_id]) # map_id追加
end
end
포인트 자세히 보기preload를 통해 관련 데이터 읽기
lib/live_logger/loggers.ex
defmodule LiveLogger.Loggers do
...
def get_map_with_points!(id) do
Map
|> preload(:points)
|> Repo.get!(id)
end
...
end
API 수동 생성generator 없이 할 수 있지만, 결코 어렵지 않다
alias로 context와 모형 모듈 읽기
action_fallback 지정
api 추가
응답은 센스. - 네.resp만 있고 JSON은 아무것도 돌려주지 않기 때문에 View 파일이 없습니다
lib/live_logger_web/controllers/point_controller.ex
defmodule LiveLoggerWeb.PointController do
use LiveLoggerWeb, :controller
alias LiveLogger.Loggers
alias LiveLogger.Loggers.Point
action_fallback LiveLoggerWeb.FallbackController
def create(conn, point_params) do
with {:ok, %Point{}} <- Loggers.create_point(point_params) do
send_resp(conn, 200, "ok")
end
end
end
endpoint 추가댓글이 삭제된api scope
콘솔에 있는 루팅 코드 추가
points는create만 있기 때문에 only가 지정합니다
lib/live_logger_web/router.ex
defmodule LiveLoggerWeb.Router do
use LiveLoggerWeb, :router
...
# Other scopes may use custom stacks.
scope "/api", LiveLoggerWeb do
pipe_through :api
resources "/maps", MapController, except: [:new, :edit]
resources "/points", PointController, only: [:create]
end
end
동작 확인Postman 작업 확인
get api/maps
발표하다.
get api/maps/1
post api/maps
create의 매개 변수는%{map:map param}=params이므로 맵[열명]을 json 형식으로 합니다
delete api/maps/2
JSON의 반응 없이 204번 콘텐츠가 돌아왔습니다.
create api/points
맵과 다른pointParams이기 때문에 평면의formdata는 괜찮습니다.
최후
phx.gen.json을 통해 API의 실현도 간단하다
json response에서 데이터가 거치적거린다면 다음과 같은 방법으로 제거할 수 있습니다
lib/live_logger_web/views/map_view.ex
defmodule LiveLoggerWeb.MapView do
use LiveLoggerWeb, :view
alias LiveLoggerWeb.MapView
def render("index.json", %{maps: maps}) do
render_many(maps, MapView, "map.json") # dataとMapの囲いを消す
end
...
end
이상은 본 보도입니다.API에서 인증이 수행됩니다.
Code
Reference
이 문제에 관하여(Phoenix를 사용한 GPS Logging System4 API 설치), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/the_haigo/items/5d4d96a3e4c7a068dce3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)