【发布时间】:2019-02-21 04:34:50
【问题描述】:
我最近想开始在我的网站中实现 API,但由于我缺乏关于如何使用 Ruby on Rails 正确发送 JSON 数据的知识,我遇到了一些关于验证的问题。我过去曾使用过一些 API 和 JSON,但这是我第一次同时使用这两种方法,而且我在 RoR 方面的经验仍然不足。
我的第一直觉是将参数连接到 url 上,在看到来自 API 的更积极(尽管仍然不完整)的 JSON 响应后,我认为我走在正确的轨道上,但在未能获得成功的响应后,我开始深入研究我发送的确切内容,那时我发现了两个问题。
第一个问题是 URL 中包含敏感信息,例如我的 clientID,有关购买的信息,例如价格和描述,以及使用 MD5 和一些加密盐加密的密钥,但根据文档,它是安全且只是为了与服务器收到的信息进行比较,所以总的来说我不太担心会泄露那种信息。我仍然想改进我的代码并尽可能多地保护信息。
我的第二个问题更严重,我注意到发送的信息不完整,由于 url 参数中的空间有限。
就在那时我知道我做错了,所以我开始寻找替代方案,最好是使用 POST 响应,但是我仍然缺乏关于如何使用 POST 正确发送参数的知识,并且在我尝试时信息仍然存在使用表单,更糟糕的是,与我之前的尝试不同,我发送的参数在另一端似乎是空的,所以我开始深入研究它。
然后我发现link_to帮助器可以发送参数,但是经过一些测试它不起作用然后我发现用rails向外部站点发送参数,建议的方法是将参数连接到url中,于是我原路返回。
所以我的问题是,如何在没有表单的情况下将参数发送到外部网站(最好同时保持所有信息尽可能安全)(因为所有信息之前都已在之前的表单中填写过) ?
虽然我之前使用过 API 和 JSON,但它们仍然是我不太习惯使用它们的主题,并且在某种程度上我仍然在 RoR 中学到了很多东西。
这是给我带来最多结果的代码(真实的看起来有点不同):
我的控制器order_controller.rb
def confirm_order
#Here I group all the parameters I'll need
@payment_params = []
description = "create_"+ @order.name.gsub(' ','_')
device_info = "WEB"
currency = @order.currency
fee = @order.price
#this was to concatenate the url, previouly I had the name of each parameter and the "&" taken into account, the response was different as I added each.
@payment_params << description << device_info << currency << fee
end
在我看来confirm_order.html.erb类似于
<a href= <%="https://payexample/something/order?"+ @payment_params%> >Confirm order</a>
欢迎任何见解,但现在我真的不知道如何解决这个问题,因为我已经用尽了我所学到的一切。
【问题讨论】:
-
如果你想做一个帖子,你应该构建一个表单,或者转向一种 Javascript 方法,在这种方法中,你可以捕获链接点击并将请求转换为帖子请求,例如通过 Ajax .
-
不确定您是否担心安全性,也许github.com/jwt/ruby-jwt 会有所帮助。您可以使用编码后的令牌作为参数,有效负载可以是任意长的。唯一的缺点是接收者必须解码令牌才能看到参数。
标签: ruby-on-rails json ruby external-url