我可以减少 ruby 哈希序列化中的重复吗?
Posted
技术标签:
【中文标题】我可以减少 ruby 哈希序列化中的重复吗?【英文标题】:Can I reduce duplication in the serialization of a ruby hash? 【发布时间】:2021-10-12 07:14:42 【问题描述】:我有一个格式的哈希
com: 1234, users: [nid: 3, sets: [1,2,3,4], nid: 4, sets: [5,6,7,8]]
我正在发送到远程服务器。我正在使用HTTParty
gem 来执行此操作。代码是这样的
class Api
include HTTParty
attr_accessor :headers
def initialize
@headers = 'Content-Type' => 'application/json'
end
def post_com(hsh)
response = self.class.post('some_url', query: hsh, headers: headers, format: :plain)
end
end
当我这样做时
api = Api.new.post_com(com: 1234, users: [nid: 3, sets: [1,2,3,4], nid: 4, sets: [5,6,7,8]]
在远程服务器上,哈希以以下格式发送
POST "/some_url?com=1234&users[][nid]=3&users[][sets][]=1&users[][sets][]=2&users[][sets][]=3&users[][sets][]=4&users[][nid]=4&users[][sets][]=5&users[][sets][]=6&users[][sets][]=7&users[][sets][]=8
这意味着对于集合中的每个条目,都将发送重复的字符 users[][sets][]
。在操作中,set中可以有很多条目,结果是服务器拒绝了帖子,因为它有太多的字符。
无论如何我可以用更少的重复序列化哈希。例如,如果我只是这样做
com: 1234, users: [nid: 3, sets: [1,2,3,4], nid: 4, sets: [5,6,7,8]].to_json
我收到
"\"com\":1234,\"users\":[\"nid\":3,\"sets\":[1,2,3,4],\"nid\":4,\"sets\":[5,6,7,8]]"
字符少得多。
【问题讨论】:
您确定它是以 json 格式发送的吗? (我的意思是content_type,接收方是否将此请求识别为json?) 【参考方案1】:HTTParty 默认将:query
哈希转换为它所谓的“rails 样式查询参数”:
查询: 获取'/',查询:selected_ids: [1,2,3]
默认查询字符串如下所示: /?selected_ids[]=1&selected_ids[]=2&selected_ids[]=3
由于您正在执行 POST,因此可以/最好在请求正文中而不是在查询字符串中发送您的哈希。
def post_com(hsh)
self.class.post('some_url', body: hsh.to_json, headers: headers, format: :plain)
end
这样做的好处是它不会对有效负载进行任何转换,并且查询字符串长度限制无论如何都不适用。
作为记录,您可以像这样禁用默认的“rails style”编码:
class Api
include HTTParty
disable_rails_query_string_format
...
end
您还可以通过将Proc
传递给query_string_normalizer
来滚动您自己的自定义查询字符串规范化器。
【讨论】:
我有机会尝试这个,只是在 post 请求中将 :query 替换为 :body 不起作用。正如这里***.com/questions/19461333/… 所解释的,hsh 需要转换为 json。所以正确的请求应该是:self.class.post('some_url', body: hsh.to_json, headers: headers, format: :plain)。我会编辑问题还是您确实想这样做? 我不介意更改它,但我很困惑,因为那是我设置的测试项目的直接副本。 也许我们有不同的设置。也许请注意,根据设置,您可能需要将哈希转换为 json。以上是关于我可以减少 ruby 哈希序列化中的重复吗?的主要内容,如果未能解决你的问题,请参考以下文章
Double-splat 运算符破坏性地修改了哈希——这是一个 Ruby 错误吗?
[LeetCode]652. Find Duplicate Subtrees找到重复树