我可以减少 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​​ 哈希序列化中的重复吗?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby - 按值按降序排序哈希值

Double-splat 运算符破坏性地修改了哈希——这是一个 Ruby 错误吗?

[LeetCode]652. Find Duplicate Subtrees找到重复树

使用类常量作为 Ruby 哈希键

leetcode每日一题(2020-05-22):105. 从前序与中序遍历序列构造二叉树

如何在 .NET 中使用 Hashtables/HashSets?