如何从Ruby中的多行字符串中的第n行到最后一行获取数据?

时间:2019-12-22 21:16:00

标签: ruby string

我正在使用ruby执行以下curl请求:

cmd="curl --silent --insecure -i -X GET -u \"local\username:password\" \"https://example.com/Console/Changes\""
response = `cmd`

它产生以下输出:

enter image description here

从上面的输出看来,响应变量包含多行字符串值。只是为了确认,我正在尝试在此处打印“响应”变量的类型:

puts response.class

这里的输出是:

  

字符串

如何从上述响应中分别提取标头信息和json正文?

1 个答案:

答案 0 :(得分:1)

有更好的方法可以在Ruby中执行HTTP请求,例如使用标准库的Net::HTTP

话虽如此,我会回答你的问题。

HTTP标准specifies,其中标头和正文由仅包含CRLF(\r\n)的空行分隔。标头的每一行也以CRLF结尾。因此,我们可以简单地在第一次出现两个CRLF时,即在字符串"\r\n\r\n"处拆分响应。

由于此序列也可能出现在主体中,因此我们需要指定我们的拆分最多包含2个元素。

header, body = response.split("\r\n\r\n", 2)

请注意,尽管如此,最后一个标题行不会以"\r\n"结尾,但这不应该成为问题。从技术上讲,更正确的版本是在"\r\n"后面加上"\r\n"。这样,我们在拆分时就不会剥离结尾的"\r\n"。可以使用后视的正则表达式完成此操作:

header, body = response.split(/(?<=\r\n)\r\n/, 2)

标题中的问题答案有些不同:

  

如何从ruby中的多行字符串中的第n行到最后一行获取数据?

response.lines[n..].join

(在Ruby 2.6之前,范围必须指定为n..-1。)