栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Sinatra控制器params方法在JSON发布请求中变为空

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Sinatra控制器params方法在JSON发布请求中变为空

为了回答这个问题,我们首先必须查看一些HTTP请求(仅是简单的

telnet
“消息”;可以很容易地手动创建)。首先,提交普通的HTML会发生什么
<form>
?该
POST
请求看起来将与此非常相似(可能带有一些额外的参数,但是我们现在不必担心这一点):

POST /submit-form HTTP/1.1Host: localhostContent-Type: application/x-www-form-urlenpredContent-Length: 12name=JohnDoe

逐个字符地键入该字符(用

/sample-form
任何形式操作的URL
替换URL,并
Host
用您的IP或主机名替换该字符)将与您的浏览器发送的内容相同。要学习的重要内容是参数语法:
formname=formvalue

Sinatra 使用此语法将
POST
请求的内容解释为
params
哈希!
因此,与此基本不兼容的JSON请求将因此 不会
显示在
params
哈希中。


但是,您在

before
街区中所做的事情显示了正确的解决方案。虽然
params
从上面将是
{'name' =>'JohnDoe'}
request.body.read
将返回原始主体,
name=JohnDoe

知道了这一点,就可以理解为什么您的“
hacky”解决方案起作用了:

POST
请求的原始主体由解释
JSON.parse
,然后插入到空
params
哈希中。看起来很笨拙的原因是因为
params
在此示例中是不必要的中间人。以下应完成此工作:

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

但是,采用更好做法的解决方案要么仅在提供JSON内容时响应,要么在提交标准表单时做出不同响应。如上述示例HTTP

POST
请求所示,HTML表单使用
application/x-www-form-urlenpred
MIME类型标识,而JSON使用标识
application/json



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/485392.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号