我最近想开始在我的网站中实现API,但是由于缺乏有关如何使用Ruby on Rails正确发送JSON数据的知识,我遇到了一些有关验证的问题。我过去曾经使用过一些API和JSON,但这是我第一次同时完成这两个工作,而且我仍然缺乏在RoR方面的经验。
我的第一个直觉是将参数连接到url上,并且看到来自API的更积极的(尽管仍然不完整)JSON响应后,我认为自己的方向正确,但是在未能获得成功的响应后,我开始深入研究我发送的确切信息,那是当我注意到两个问题时。
第一个问题是,URL内有敏感信息,例如我的clientID,有关购买的信息,如价格和说明,以及用MD5加密的密钥和一些加密盐,但是根据文档,它是安全且安全的只是为了与服务器接收到的信息进行比较,所以总的来说,我不太担心会破坏这种信息。仍然我想改进我的代码并保护尽可能多的信息。
我的第二个问题更为严重,由于url参数中的空间有限,我注意到发送的信息不完整。
那时候我知道我做错了,所以我开始寻找替代方法,最好是使用POST响应,但是我仍然缺乏如何通过POST正确发送参数的知识,并且当我尝试时该信息仍然存在使用表单,更糟糕的是,与之前的尝试不同,我发送的参数似乎在另一端空了,所以我开始对其进行深入研究。
然后,我发现link_to帮助程序可以发送参数,但是在进行一些测试后,它不起作用,然后我发现将参数发送到带有rails的外部站点,建议的方法是将参数连接到url中,所以我回来了整圈。
所以我的问题是,如何将参数发送到外部网站(最好在使所有信息尽可能安全的同时),而无需在Rails中使用表单(因为所有信息以前已经用以前的表单填写了) ?
虽然我之前曾经使用过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>
欢迎任何见识,但是由于我已经用尽了所学的一切,现在我真的对如何解决这个问题一无所知。
答案 0 :(得分:1)
我对您的UI外观有点困惑,但是我会将所有这些信息都保留在链接之外,并确保在POST中进行确认(因为某些浏览器会预载链接,这可能会导致意外购买如果您将其保留为链接)。我会改用button_to
助手。
我不确定您如何跟踪订单,无论是在数据库中还是在会话中,还是什么。因此,您可能需要稍微修改一下才能使正确的参数通过。
https://apidock.com/rails/ActionView/Helpers/UrlHelper/button_to
<%= button_to('Confirm order', action: 'confirm_order') %>
然后,在您的confirm_order
操作中,您可以重定向到付款站点,而不是将所有这些机密信息始终放置在页面上。如果有人正在观看网络流量,他们会很快真正地看到标题中的流量,但发现它并不容易,而且页面上的链接可以在新标签中多次打开。
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
redirect_to("https://payexample/something/order?#{@payment_params}")
end
我不确定您要重定向网址是什么。这取决于外部站点。如果需要将其用作查询字符串参数,则可以对键和值进行哈希处理,然后使用to_query
方法将其转换为查询字符串。