Mar*_*iro 5 json elixir phoenix-framework
我想将数据用作手动编写的JSON文件,而不是从数据库中获取数据.假设我的数据是这样的:
[
{ "id": 1, "name": "Alice", "email": "alice@example.com" },
{ "id": 2, "name": "Bob", "email": "bob@example" },
{ "id": 3, "name": "Charles", "email": "charles@example.com"}
]
Run Code Online (Sandbox Code Playgroud)
它写在一个名为的文件中MOCK_DATA.json.当我访问localhost:port/api/v1/users网址时,我该怎么做才能呈现此文件?如何localhost:port/api/v1/users/1显示网址{ "id": 1, "name": "Alice", "email": "alice@example.com" }?
这是一个基本的工作示例......
第1步:创建凤凰应用程序例如,exjson用于ExampleJson或任何你喜欢的名字
mix phoenix.new exjson --no-ecto --no-brunch --no-html
Run Code Online (Sandbox Code Playgroud)
第2步:设置路由器
将此范围添加到web/router.ex文件中
scope "/api/v1", Exjson do
pipe_through :api
resources "/users", UserController
end
Run Code Online (Sandbox Code Playgroud)
第3步:将模拟数据放在应用程序可访问的位置
priv/data/MOCK_DATA.json
Run Code Online (Sandbox Code Playgroud)
第4步:设置UsersController
可以将用户控制器视为具有许多动作(函数),其中conn struct从您的phoenix端点以及任何参数输入
defmodule Exjson.UserController do
use Exjson.Web, :controller
# GET http://localhost:4000/api/v1/users/
def index(conn, _params) do
users = File.read!(file) |> Poison.decode!()
render conn, users: users
end
# GET http://localhost:4000/api/v1/users/1
def show(conn, params) do
users = File.read!(file) |> Poison.decode!()
render conn, user: users |> Enum.find(&(&1["id"] === String.to_integer(params["id"])))
end
defp file() do
Path.join(:code.priv_dir(:exjson), "data/MOCK_DATA.json")
end
end
Run Code Online (Sandbox Code Playgroud)
第5步:设置UsersView
您还可以将用户视图视为具有以适当方式呈现从Controller接收的数据的功能.在这种情况下,您正在使用json数据,因此phoenix具有一些内置函数来帮助实现这一点.
defmodule Exjson.UserView do
use Exjson.Web, :view
def render("index.json", %{users: users}) do
render_many(users, __MODULE__, "user.json")
end
def render("show.json", %{user: user}) do
render_one(user, __MODULE__, "user.json")
end
def render("user.json", %{user: user}) do
%{
id: user["id"],
name: user["name"],
email: user["email"]
}
end
end
Run Code Online (Sandbox Code Playgroud)
为了给你一些真正的代码来开始,这是我能想到的最简单的事情:
defmodule MyApp.UserController do
@mock_data (
Application.app_dir(:my_app, "priv/mock_data/users.json")
|> File.read!
|> Poison.decode!
)
def index(conn, _params) do
conn
|> put_status(:ok)
|> json(@mock_data)
end
end
Run Code Online (Sandbox Code Playgroud)
然后将您的假数据保存在priv/mock_data/users.json项目中.那里可能有拼写错误,但你得到的基本想法......
| 归档时间: |
|
| 查看次数: |
4424 次 |
| 最近记录: |