Postman 多部分 POST 到 Rails
Postman multipart POST to Rails
我正在尝试从某个客户端向 rails 服务器发送 POST 请求,我有一些 problems.The 完整的要求是将图像发送到由回形针处理,但它看起来像是一个普通的邮递员多部分 POST 有 Rails 问题。
这就是我得到的:
下面是我的设置:
class CategoriesController < ApplicationController
def create
@category = Category.new(category_params)
respond_to do |format|
if @category.save
format.html { redirect_to @category, notice: 'Category was successfully created.' }
format.json { render :show, status: :created, location: @category }
else
format.html { render :new }
format.json { render json: @category.errors, status: :unprocessable_entity }
end
end
end
private
def category_params
params.require(:category).permit(:label, :description)
end
我假设问题是请求参数没有封装在 "categories" 中。
如果我不够清楚,请告诉我,如果我可以提供更多信息。
提前致谢。
编辑:
正如 fylooi 所建议的,我已经更改了 Postman 中的请求主体,添加了一个封装 "entity" ,如下所示:
我仍然得到相同的结果
Processing by CategoriesController#create as JSON
Parameters: {"------WebKitFormBoundaryFdJXZFMuAl0fZf3Q\r\nContent-Disposition: form-data; name"=>"\"category[label]\"\r\n\r\nTraffic\r\n------WebKitFormBoundaryFdJXZFMuAl0fZf3Q\r\nContent-Disposition: form-data; name=\"category[description]\"\r\n\r\nTraffic category\r\n------WebKitFormBoundaryFdJXZFMuAl0fZf3Q--\r\n"}
Completed 400 Bad Request in 1ms (ActiveRecord: 0.0ms)
ActionController::ParameterMissing (param is missing or the value is empty: category):
app/controllers/categories_controller.rb:67:in `category_params'
app/controllers/categories_controller.rb:27:in `create'
Postman 与 Rails 配合良好,您只需要了解 Rails 通常如何处理参数。
假设您 POST 服务器的以下参数:
plain_param=value
nested_object[attribute]=value
这被解析为以下内容:
pry(main)> params = ActionController::Parameters.new(plain_param:"value", nested_object: { attribute: "value" } )
=> {"plain_param"=>"value", "nested_object"=>{"attribute"=>"value"}}
让我们来看看permit
是如何工作的。
params.permit(:plain_param)
pry(main)> params.permit(:plain_param)
Unpermitted parameter: nested_object
=> {"plain_param"=>"value"}
pry(main)> params.permit(:nested_object)
Unpermitted parameters: plain_param, nested_object
=> {}
pry(main)> params.permit(:nested_object => :attribute)
Unpermitted parameter: plain_param
=> {"nested_object"=>{"attribute"=>"value"}}
pry(main)> params.permit(:plain_param, :nested_object => :attribute )
=> {"plain_param"=>"value", "nested_object"=>{"attribute"=>"value"}}
到目前为止,还不错。看起来像 permit
returns 顶级和嵌套允许键的整个散列,并打印未经许可键的警报。 require
怎么样?
[33] pry(main)> params
=> {"plain_param"=>"value", "nested_object"=>{"attribute"=>"value"}}
pry(main)> params.require(:plain_param)
=> "value"
pry(main)> params.require(:nested_object)
=> {"attribute"=>"value"}
pry(main)> params.require(:nested_object => :attribute)
ActionController::ParameterMissing: param is missing or the value is empty: {:nested_object=>:attribute}
pry(main)> params.require(:plain_param, :nested_object)
ArgumentError: wrong number of arguments (2 for 1)
我们可以看到 require
returns 单个参数键的值。这有助于确保 objects 具有多个属性。
总结:
params.require(:category).permit(:label, :description)
需要
形式的散列
{:category=>{:label=>"value", :description=>"value"}}
转换为 HTML POST 参数
category[label]=value
category[description]=value
编辑:Postman 自动设置 content-type
header 用于多部分文件上传,所以不要手动设置。不确定这是否被视为错误或功能。
https://github.com/postmanlabs/postman-app-support/issues/191
我正在尝试从某个客户端向 rails 服务器发送 POST 请求,我有一些 problems.The 完整的要求是将图像发送到由回形针处理,但它看起来像是一个普通的邮递员多部分 POST 有 Rails 问题。
这就是我得到的:
class CategoriesController < ApplicationController
def create
@category = Category.new(category_params)
respond_to do |format|
if @category.save
format.html { redirect_to @category, notice: 'Category was successfully created.' }
format.json { render :show, status: :created, location: @category }
else
format.html { render :new }
format.json { render json: @category.errors, status: :unprocessable_entity }
end
end
end
private
def category_params
params.require(:category).permit(:label, :description)
end
我假设问题是请求参数没有封装在 "categories" 中。 如果我不够清楚,请告诉我,如果我可以提供更多信息。
提前致谢。
编辑:
正如 fylooi 所建议的,我已经更改了 Postman 中的请求主体,添加了一个封装 "entity" ,如下所示:
我仍然得到相同的结果
Processing by CategoriesController#create as JSON
Parameters: {"------WebKitFormBoundaryFdJXZFMuAl0fZf3Q\r\nContent-Disposition: form-data; name"=>"\"category[label]\"\r\n\r\nTraffic\r\n------WebKitFormBoundaryFdJXZFMuAl0fZf3Q\r\nContent-Disposition: form-data; name=\"category[description]\"\r\n\r\nTraffic category\r\n------WebKitFormBoundaryFdJXZFMuAl0fZf3Q--\r\n"}
Completed 400 Bad Request in 1ms (ActiveRecord: 0.0ms)
ActionController::ParameterMissing (param is missing or the value is empty: category):
app/controllers/categories_controller.rb:67:in `category_params'
app/controllers/categories_controller.rb:27:in `create'
Postman 与 Rails 配合良好,您只需要了解 Rails 通常如何处理参数。
假设您 POST 服务器的以下参数:
plain_param=value
nested_object[attribute]=value
这被解析为以下内容:
pry(main)> params = ActionController::Parameters.new(plain_param:"value", nested_object: { attribute: "value" } )
=> {"plain_param"=>"value", "nested_object"=>{"attribute"=>"value"}}
让我们来看看permit
是如何工作的。
params.permit(:plain_param)
pry(main)> params.permit(:plain_param)
Unpermitted parameter: nested_object
=> {"plain_param"=>"value"}
pry(main)> params.permit(:nested_object)
Unpermitted parameters: plain_param, nested_object
=> {}
pry(main)> params.permit(:nested_object => :attribute)
Unpermitted parameter: plain_param
=> {"nested_object"=>{"attribute"=>"value"}}
pry(main)> params.permit(:plain_param, :nested_object => :attribute )
=> {"plain_param"=>"value", "nested_object"=>{"attribute"=>"value"}}
到目前为止,还不错。看起来像 permit
returns 顶级和嵌套允许键的整个散列,并打印未经许可键的警报。 require
怎么样?
[33] pry(main)> params
=> {"plain_param"=>"value", "nested_object"=>{"attribute"=>"value"}}
pry(main)> params.require(:plain_param)
=> "value"
pry(main)> params.require(:nested_object)
=> {"attribute"=>"value"}
pry(main)> params.require(:nested_object => :attribute)
ActionController::ParameterMissing: param is missing or the value is empty: {:nested_object=>:attribute}
pry(main)> params.require(:plain_param, :nested_object)
ArgumentError: wrong number of arguments (2 for 1)
我们可以看到 require
returns 单个参数键的值。这有助于确保 objects 具有多个属性。
总结:
params.require(:category).permit(:label, :description)
需要
形式的散列{:category=>{:label=>"value", :description=>"value"}}
转换为 HTML POST 参数
category[label]=value
category[description]=value
编辑:Postman 自动设置 content-type
header 用于多部分文件上传,所以不要手动设置。不确定这是否被视为错误或功能。
https://github.com/postmanlabs/postman-app-support/issues/191