我正在使用ruby执行以下curl请求:
cmd="curl --silent --insecure -i -X GET -u \"local\username:password\" \"https://example.com/Console/Changes\""
response = `cmd`
它产生以下输出:
从上面的输出看来,响应变量包含多行字符串值。只是为了确认,我正在尝试在此处打印“响应”变量的类型:
puts response.class
这里的输出是:
字符串
如何从上述响应中分别提取标头信息和json正文?
答案 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
。)