gpt4 book ai didi

json - Sinatra Controller 参数方法在 JSON 发布请求中为空

转载 作者:IT老高 更新时间:2023-10-28 12:52:21 26 4
gpt4 key购买 nike

我有一个 Sinatra 应用程序,在我的大多数 Controller 中,json 都会进入并在 params 对象中自动获取。但是,我有一个 post 操作,它根本没有获取参数,除非我使用 before 方法来拉取 request.body 参数,将它们解析为 JSON 并将它们合并到 params 哈希中。

这里是 Controller ,以及过滤器方法:

before do
if request.request_method == "POST"
body_parameters = request.body.read
params.merge!(JSON.parse(body_parameters))
end
end


post '/locations/new' do
content_type :json
puts "params after post params method = #{params.inspect}"
... other code ...
end

我看到的输出基本上是 Controller Action 中的参数实际上是正确的。但是,如果我注释掉之前的调用,则参数为空。

before 本身感觉就像一个 hack。无论如何,我都希望那些参数会进来……我一定是做错了什么,但我不知道那是什么。

任何帮助将不胜感激......

最佳答案

为了回答这个问题,我们首先要查看一些 HTTP 请求(它们只不过是简单的 telnet '消息';这可以很容易地手动重新创建)。首先,当你提交一个普通的 HTML <form> 时会发生什么? ? POST request 看起来与此非常相似(可能带有一些额外的参数,但我们现在不需要担心):

POST /submit-form HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: 12

name=JohnDoe

逐个字符输入(将 /sample-form 替换为任何表单操作的 URL,将 Host 替换为您的 IP 或主机名)将与您的浏览器发送的内容相同。从中学习的重要一点是参数语法:formname=formvalue . Sinatra 解释 POST 的正文请求进入 params使用此语法散列!因此,与此基本不兼容的 JSON 请求将不会显示在 params 中因为这个而散列。

但是,您在 before 中所做的事情 block 显示正确的解决方案。而params从上面将是{'name' => 'JohnDoe'} , request.body.read将返回原始正文,name=JohnDoe .

知道了这一点,就可以理解为什么您的“hacky”解决方案有效:POST 的原始正文请求被 JSON.parse 解释, 然后被插入到空的 params哈希。它看起来很hacky的原因是因为params在这个例子中是一个不必要的中间人。以下应该可以完成这项工作:

post '/locations/new' do
@json = JSON.parse(request.body.read)
# @json now contains a hash of the submitted JSON content
end

但是,一个采用更好做法的解决方案要么仅在提供 JSON 内容时做出响应,要么在提交标准表单时做出不同的响应。如上例所示 HTTP POST请求,HTML 表单用 application/x-www-form-urlencoded 标识MIME 类型,而 JSON 用 application/json 标识.如果您想查看 POST 的详细信息请求的 MIME 类型,查看 this question with some great answers关于如何使用 Sinatra 做到这一点!

关于json - Sinatra Controller 参数方法在 JSON 发布请求中为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12131763/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com