【问题标题】:Limit fields of JSON responseJSON响应的限制字段
【发布时间】:2016-01-27 20:10:08
【问题描述】:

我正在使用 PhoenixFramework 和库 Poison。 目前我正在开发一个 REST API。现在我需要以两种不同的方式对模型Book 进行编码。

  1. 在仅包含基本信息的所有书籍列表中 (GET /books)
  2. 包含所有信息的详细视图 (GET /book/1)

GET /books

{
  "books": [
    {
      "id": 1,
      "name": "Book one"
    },
    {
      "id": 2,
      "name": "Book two"
    },
    // ...
  ]
}

GET /books/1

{
  "book": {
     "id": 1,
     "name": "Book one",
     "description": "This is book one.",
     "author": "Max Mustermann",
    // ...
  }
}

Book的编码器

defimpl Poison.Encoder, for: MyProject.Book do

  @attributes [:id, :name, :description, :author]

  def encode(project, _options) do
    project
    |> Map.take(@attributes)
    |> Poison.encode!
  end
end

片段控制器

def index(conn, _params) do
  books = Repo.all(Book)
  json(conn, %{books: books})
end

如何限制字段?我搜索类似:only:exclude 的选项。 有人遇到过这个问题吗?

感谢您的帮助!

【问题讨论】:

    标签: json elixir phoenix-framework


    【解决方案1】:

    您可以使用render_many/4render_one/4

    defmodule MyApp.BookView do
    
      def render("index.json", %{books: books}) do
        render_many(books, __MODULE__, "book.json")
      end
    
      def render("show.json", %{book: book}) do
        render_one(book, __MODULE__, "full_book.json")
      end
    
      def render("book.json", %{book: book}) do
        %{
          id: book.id,
          name: book.name
        }
      end
    
    
      def render("full_book.json", %{book: book}) do
        %{
          id: book.id,
          name: book.name,
          description: description,
          author: book.author
          ...
        }
      end
    end
    

    请注意,assigns 中的名称(render 的第二个参数)由模块决定。有关使用不同名称的示例,请参阅 Render many to many relationship JSON in Phoenix Framework

    然后您可以使用以下方法从您的控制器中调用它:

    render(conn, "index.json", books: Repo.all(Book))
    
    render(conn, "show.json", book: Repo.get(Book, 1))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-01
      • 2014-10-23
      • 1970-01-01
      • 2018-12-21
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多