Luk*_* Xu 1 elixir phoenix-framework
我可以做一个GET请求,但我似乎无法获得POST请求.
这些是我的路线
article_path GET /api/articles Lxphnx.ArticleController :index
article_path GET /api/articles/:id Lxphnx.ArticleController :show
article_path POST /api/articles Lxphnx.ArticleController :create
article_path PATCH /api/articles/:id Lxphnx.ArticleController :update
PUT /api/articles/:id Lxphnx.ArticleController :update
article_path DELETE /api/articles/:id Lxphnx.ArticleController :delete
Run Code Online (Sandbox Code Playgroud)
除了使用mix phoenix.gen.json之外,我还没有碰过任何东西.这个项目只是一个API,因此我在创建项目时也使用了--no-brunch --no-html.
控制器:
defmodule Lxphnx.ArticleController do
use Lxphnx.Web, :controller
alias Lxphnx.Article
def index(conn, _params) do
articles = Repo.all(Article)
render(conn, "index.json", articles: articles)
end
def create(conn, %{"article" => article_params}) do
changeset = Article.changeset(%Article{}, article_params)
case Repo.insert(changeset) do
{:ok, article} ->
conn
|> put_status(:created)
|> put_resp_header("location", article_path(conn, :show, article))
|> render("show.json", article: article)
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render(Lxphnx.ChangesetView, "error.json", changeset: changeset)
end
end
def show(conn, %{"id" => id}) do
article = Repo.get!(Article, id)
render(conn, "show.json", article: article)
end
def update(conn, %{"id" => id, "article" => article_params}) do
article = Repo.get!(Article, id)
changeset = Article.changeset(article, article_params)
case Repo.update(changeset) do
{:ok, article} ->
render(conn, "show.json", article: article)
{:error, changeset} ->
conn
|> put_status(:unprocessable_entity)
|> render(Lxphnx.ChangesetView, "error.json", changeset: changeset)
end
end
def delete(conn, %{"id" => id}) do
article = Repo.get!(Article, id)
# Here we use delete! (with a bang) because we expect
# it to always work (and if it does not, it will raise).
Repo.delete!(article)
send_resp(conn, :no_content, "")
end
end
Run Code Online (Sandbox Code Playgroud)
路由器:
defmodule Lxphnx.Router确实使用Lxphnx.Web,:router
pipeline :api do
plug :accepts, ["json"]
end
scope "/api", Lxphnx do
pipe_through :api
resources "/articles", ArticleController, except: [:new, :edit]
end
end
Run Code Online (Sandbox Code Playgroud)
视图:
defmodule Lxphnx.ArticleView do
use Lxphnx.Web, :view
def render("index.json", %{articles: articles}) do
%{data: render_many(articles, Lxphnx.ArticleView, "article.json")}
end
def render("show.json", %{article: article}) do
%{data: render_one(article, Lxphnx.ArticleView, "article.json")}
end
def render("article.json", %{article: article}) do
%{id: article.id,
title: article.title,
body: article.body,
type: article.type}
end
end
Run Code Online (Sandbox Code Playgroud)
哦,我也在POST时尝试过这个Phoenix.ActionClauseError,没有匹配的动作子句来处理请求
我正在使用cURL,我不会忘记它是一个应用程序/ json.这是我的卷曲请求:curl -X POST -d '{"id":1, "title":"a title", "body":"a body", "type:1"}' -o log.txt localhost:4000/api/articles如果我使用邮递员,我会得到相同的结果.
为了使您的函数子句匹配,您需要在curl请求中指定"article":
curl -X POST -d '{"article": {"id":1, "title":"a title", "body":"a body", "type:1"}}' -o log.txt localhost:4000/api/articles
Run Code Online (Sandbox Code Playgroud)
如果您不想在对象中使用此顶级键,请更改:
def create(conn, %{"article" => article_params}) do
changeset = Article.changeset(%Article{}, article_params)
Run Code Online (Sandbox Code Playgroud)
至:
def create(conn, article_params) do
changeset = Article.changeset(%Article{}, article_params)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1668 次 |
| 最近记录: |