【问题标题】:How to build postman request for Rails POST method如何为 Rails POST 方法构建邮递员请求
【发布时间】:2014-10-24 13:57:36
【问题描述】:

无论我如何格式化这个请求的原始部分,我都无法避免下面的解析错误。

我有一个带有通过规范的 create 方法的 Rails API,以说明控制器消息是正确的:

describe "POST power_up" do

    let!(:client) { FactoryGirl.create :client, name: "joe", auth_token: "asdfasdfasdfasdfasdfasdf" }

    it "should create and save a new Power Up" do

      expect { post :create, format: :json, power_up: FactoryGirl.attributes_for(:power_up) }.to change(V1::PowerUp, :count).by(1)
    end

  end

我正在使用 Postman 尝试 POST 到它。无论我尝试什么,我都会收到错误:

Started POST "/v1/power_ups.json" for 127.0.0.1 at 2014-08-30 18:05:29 -0400
Error occurred while parsing request parameters.
Contents:

{
  'name': 'foo',
  'description': 'bar'
}


ActionDispatch::ParamsParser::ParseError (795: unexpected token at '{
  'name': 'foo',
  'description': 'bar'
}

邮递员请求设置:

我也试过了:

{
  'power_up': {
    'name': 'foo',
    'description': 'bar'
   }
}

power_ups_controller.rb 中的 create 方法和强参数声明代码:

def create
    @power_up = PowerUp.new(power_up_params)

  if @power_up.save!
    redirect_to @power_up
  end
end

private

  def power_up_params
    params.require(:power_up).permit(:name, :description)
  end

【问题讨论】:

    标签: ruby-on-rails rest postman


    【解决方案1】:

    单引号 (') 在 JSON 中实际上不是合法的 string delimiter:字符串必须用双引号 (") 括起来。您可以在浏览器中避开它,因为它们是 javascript 中的字符串分隔符。您可以在 irb 会话中轻松复制它

    JSON.parse(%q[{'foo': 'bar'}]) #=> raises JSON::ParserError
    JSON.parse(%q[{"foo": "bar"}]) #=> ok
    

    此外,鉴于您的规范,您应该使用第二种形式,即

    {
      "power_up": {
        "name": "foo",
        "description": "bar"
       }
    }
    

    【讨论】:

    • 你让我更接近它的出现。但是我得到以下信息:ActionController::ParameterMissing (param is missing or the value is empty: power_up):。我还尝试删除封闭的大括号。
    • 这意味着数据不符合您的控制器设置的强参数要求。
    • 我在上面添加了强参数和创建方法。有一个怪癖,PowerUp 在模块 V1 内。
    • 我觉得不错。查看日志文件可能会很有趣,看看 rails 是如何解析这个的(应该是 "power_up" => {"name" => "foo", "description" => "bar"}
    • 感谢您指出这一点。当我按照您的建议执行请求时,日志中没有显示传入参数值的语句。但是,如果我使用表单值,我可以获得Parameters: {"name"=>"foo", "description"=>"bar"},但是我看不到邮递员将表单分配给power_up 对象的方法。
    【解决方案2】:

    很抱歉回答这个问题为时已晚,但可能对其他人有所帮助。

    您需要做的就是在您的请求标头(在邮递员或任何客户端)中添加-

    Content-Type = 'application/json'
    

    或者,您也可以使用 curl(来源)进行尝试:

    curl -X POST -H "Content-Type: application/json" -d '{"power_up": {
        "name": "foo",
        "description": "bar"
       }
    }' 127.0.01:3000/v1/power_ups.json
    

    【讨论】:

    • 我在使用 raw-json 正文时总是忘记添加Content-Type: application/json。如果没有设置,我的参数不存在(在 Rails 控制器中)谢谢你的回答,这个让我很受用!
    【解决方案3】:

    就像 @Tejas Patel 所说的,这都是关于标题的。但是,您可以不明确地设置它们:

    1.- 在请求创建区域切换到body 选项卡。设置raw 单选按钮。在下方的文本区域输入你的身体:

    {
      "power_up": {
        "name": "foo",
        "description": "bar"
       }
    }
    

    2.- 然后在右侧的下拉列表中选择JSON (application/json) 选项而不是默认的Text 选项。这将自动设置所需的标题。就是这样 - 您可以按“发送”按钮。

    【讨论】:

      猜你喜欢
      • 2017-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-12-14
      • 1970-01-01
      • 2019-07-24
      • 2019-04-28
      • 2016-12-11
      • 2021-12-01
      相关资源
      最近更新 更多