各位好。 如何强制 request.body(或任何其他非 JSON 字符串)以漂亮的多行 JSON 或 yaml 样式打印出来?
我见过将此类字符串转换为真正的 JSON 的奇特方法,但希望避免使用另一种方法。
def request_token_from_google
uri = URI.parse('https://www.googleapis.com/oauth2/v3/token')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
request = Net::HTTP::Post.new(uri.request_uri)
request.set_form_data(self.to_params)
puts "request body is"
puts request.body.to_yaml # doesn't work
puts request.body.to_json # doesn't work
http.request(request)
end
最佳答案
问题在于:
ap "request body is #{request.body.to_json}"
...你的其他尝试是你试图漂亮地打印已经是字符串的东西。 Awesome_print(和inspect
及其同类)的目的是获取一个具有某种结构的对象并打印它,以便您可以看到它的结构,但是字符串没有结构 - 它只是字符,字符, 特点。当你给awesome_print一个像"request body is {"foo":...
这样的字符串时,它无法知道"is"后面的部分有什么特殊之处。
如果您有一个具有结构的对象,解决方案是将其直接提供给awesome_print:
puts "request body is:"
ap my_hash_or_array
不幸的是,在这种情况下它不会有帮助,因为 request.body
也只是一个字符串 - 它是表单编码的数据,如下所示(从 Wikipedia 窃取):
Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13%25%21
就像“请求正文是...”
示例一样,awesome_print无法知道这有什么特别的。您可以做的一件非常简单的事情就是在每个键/值对之间添加换行符:
body = "Name=Jonathan+Doe&Age=23&Formula=a+%2B+b+%3D%3D+13%25%21"
puts "Request body is:"
puts body.gsub("&", "\n &")
# => Request body is:
# Name=Jonathan+Doe
# &Age=23
# &Formula=a+%2B+b+%3D%3D+13%25%21
这有一个缺点,即值仍然是百分比编码的,正如您在公式
的情况中所看到的那样。如果这是一个问题,您可以使用 CGI.parse
或 Rack::Utils.parse_query
来解析表单数据,这两种方法都可以在 Rails 中使用。它们都返回一个可以提供给 Awesome_print 的哈希值,但格式略有不同(CGI 将所有值作为数组返回,Rack::Utils 仅在它们采用“数组”格式时才返回,例如 foo[]=1&foo[ ]=2
)。这是 Rack::Utils(您只需想象输出是彩色的):
puts "Request body is:"
ap Rack::Utils.parse_query(body)
# => Request body is:"
# {
# "Name" => "Jonathan Doe",
# "Age" => "23",
# "Formula" => "a + b == 13%!"
# }
最后,一些不请自来的建议:写入 STDOUT 的 puts
和 ap
在开发中往往工作得很好,因为 Rails 的记录器也在写入 STDOUT,所以您会在与 Rails 服务器日志相同的终端窗口中看到 puts
输出。然而,在生产中,写入 STDOUT 的数据可能不会写入任何地方的文件,即使是这样,如果您在某个时刻更改 Rails.logger
配置,ap
的输出可能仍会流向其他地方。您可能想要的是使用 Rails 的记录器而不是 puts
或 ap
,这样您就可以确保所有输出都到达同一位置。幸运的是,awesome_print 为每个对象添加了一个 awesome_inspect
方法,该方法返回与使用 ap
时看到的相同的漂亮字符串,因此您仍然可以将 Awesome_print 与 Rails 一起使用。记录器
:
body_inspect = Rack::Utils.parse_query(body).awesome_inspect
Rails.logger.info("Request body is:\n#{body_inspect}")
关于ruby-on-rails - 如何从表单编码字符串中获得 pretty-print 效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30631502/