Phoenix를 사용한 GPS Logging System4 API 설치

개시하다
이것은 혼자만의 LiveView Advent Calendar의 네 번째 날의 문장이다
이 글은 Elixir Conf US 2021 시스템의 구축과 관련 기술에 대한 해설을 목적으로 한 글이다
이번에는 다음과 같은 4가지를 실시한다.
  • phx.gen.json을 통한 API 제작
  • phx.gen.schema를 통해서만 모형 제작
  • API 수동 생성
  • router에 단점 추가
  • phx.gen.json
    다음 명령을 사용하여 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]
    
    
    만들어진 파일들을 한번 보도록 하겠습니다.
  • lib/live_logger_web/controllers/map_controller.ex
    CRUD API
  • 라고 적혀 있음
  • lib/live_logger_web/views/map_view.ex
    API의 응답 controller와view 파일이 한 세트라는 것을 잊지 마세요
  • lib/live_logger_web/controllers/fallback_controller.ex
    action_fallback에서 지정한 모든 API 오류 시 fallback -controller 오류 처리
  • lib/live_logger_web/views/changeset_view.ex
    422 error 시 응답 기록
  • creating test/live_logger_web/controllers/map_controller_test.exs
    시험도 자동으로 생성됩니다
  • phx.gen.schema
    모형 단일체만 만들고 싶을 때 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.ex
    defmodule 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

    좋은 웹페이지 즐겨찾기