4

フェニックス アプリケーションを構築しようとしていて、POST 要求を処理しています。リクエスト本文を取得したいのですが、その方法に関するドキュメントが見つからないようです。

いくつかのリバース エンジニアリングを行って、次のコードにたどり着きました。

defmodule MyApp.Controllers.Pages do
  use Phoenix.Controller

  def post(conn) do
    {_, {_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, body, _, _, _, _, _, _}} = conn.adapter
    text conn, "#{inspect body}"
  end
end

ルーティングあり:

defmodule MyApp.Router do
  use Phoenix.Router

  post "/test", MyApp.Controllers.Pages, :post
end

もっと良い方法があるはずですよね?

予想される行動:

curl -XPOST localhost:4000/test -d 'this is a test'
$ "this is a test"
4

4 に答える 4

1

リクエストボディに簡単にアクセスできる機能を備えたPhoenix 0.2.5をリリースしました。Plug 4.4 が をサポートするためにリリースされましたcollect_body(conn, "")。この関数は、Phoenix コントローラーのコンテキスト内でインポートされるため、 を使用して本体全体を文字列として簡単に取得できるはずですcollect_body(conn, "")。うまくいかない場合は、試してみて、Github の問題を開いてください。

https://github.com/elixir-lang/plug/blob/master/lib/plug/conn.ex#L355-L394

于 2014-06-11T18:53:55.363 に答える
0

私はelixir-langのテスト内でこれを見つけました:

defmodule MyApp.Controllers.Pages do
  use Phoenix.Controller

  def post(conn) do
    body = read_req_body(conn)
    text conn, "#{inspect body}"
  end

  defp read_req_body({:ok, buffer, state}, acc, adapter) do
    read_req_body(adapter.stream_req_body(state, 100_000), acc <> buffer, adapter)
  end

  defp read_req_body({:done, state}, acc, _adapter) do
    {acc, state}
  end

  defp read_req_body(%{adapter: {adapter, state}}) do
    {body, _} = read_req_body({:ok, "", state}, "", adapter)
    body
  end
end
于 2014-06-08T11:27:03.433 に答える