解析 json POST 正文

Posted

技术标签:

【中文标题】解析 json POST 正文【英文标题】:parse json POST body 【发布时间】:2017-01-06 11:57:15 【问题描述】:

使用以下模块定义时

defmodule Router.Folder do
  use Maru.Router

  namespace :folder do
    route_param :id do
      get do
        IO.puts "ID: " <> params[:id]
        json(conn, % user: params[:id], msg: "Hello Elixir World!" )
      end

      params do
        requires :name, type: String
      end

      post do
        IO.puts params[:name]
        IO.puts params[:token]
        IO.puts params[:id]
        IO.puts "Posting"
        json(conn, % msg: "Hello Elixir World!" )
        #conn |> text("Hello")
      end

    end  # end route_param :id
  end  # end namespace :folder
end  # end defmodule Router.Folder

defmodule FolderService.API do
  use Maru.Router

  before do
    plug Plug.Logger
    plug Plug.Parsers,
      pass: ["*/*"],
      json_decoder: Poison,
      parsers: [:urlencoded, :json]
  end

  mount Router.Folder
end

我收到此错误

**(退出)引发异常: ** (Maru.Exceptions.InvalidFormat) 解析参数错误:名称 (文件夹)lib/folder.ex:29:FolderService.API.route/2 中的匿名 fn/1 (maru) lib/maru/runtime.ex:25: Maru.Runtime.parse_params/3 (文件夹)lib/folder.ex:29:FolderService.API.route/2 中的匿名 fn/1 (文件夹)lib/folder.ex:29:FolderService.API 中的匿名 fn/1。error_handler/1 (文件夹)lib/folder.ex:29:FolderService.API.call/2 中的匿名 fn/1 (文件夹)lib/folder.ex:29:FolderService.API 中的匿名 fn/1。error_handler/1 (插件)lib/plug/adapters/cowboy/handler.ex:15:Plug.Adapters.Cowboy.Handler.upgrade/4 (cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4

运行此curl 命令时:

curl -X POST -H "Content-Type: applicaton/json" -d '"name": "foobar"' 'http://localhost:9000/folder/1233'

代码工作正常,但如果我卷曲

curl -X POST -d "name=foobar" 'http://localhost:9000/folder/1233'

【问题讨论】:

错字applicaton -> application? 是的,这是一个错字。但是,即使在 curl commnad 中更正了“应用程序”的拼写之后。错误是上面粘贴的那个。 【参考方案1】:

关于模块的一切看起来都不错。问题是,当您尝试使用 curl 发送 POST 请求时,您需要在使用 = 的地方使用 colons

这应该可以:curl -X POST -d "name:foobar" 'http://localhost:9000/folder/1233'

发送 POST 数据的示例。

How to POST JSON data with Curl from Terminal/Commandline to Test Spring REST?

【讨论】:

以上是关于解析 json POST 正文的主要内容,如果未能解决你的问题,请参考以下文章

请求不使用正文解析器显示数据

如何将 json 列表传递给 Flutter 中的 http 请求(post)正文?

在 Symfony 2.3 控制器中访问 POST 请求的 JSON 正文

Node.js POST API 和请求正文的解析

无法解析请求正文。确保请求正文与指定的内容类型匹配:应用程序/json [重复]

JSON 字符串上的 JSON 解析抛出“无法将对象转换为原始值”