来自rails的JSON HTTP响应主体似乎无效

时间:2017-07-05 18:00:16

标签: json http-headers ruby-on-rails-5

我正在使用rails,并使用以下方法返回json响应

def return_json
    render json: params
end

当我在Chrome开发者工具上查看响应时,一切似乎都是正确的。但是当我在wireshark上跟踪HTTP响应时,在HTTP响应主体上似乎存在一些额外的字符。

HTTP/1.1 200 OK
Server: nginx/1.10.3
Date: Wed, 05 Jul 2017 17:07:48 GMT
Content-Type: application/json; charset=utf-8
Transfer-Encoding: chunked
Connection: keep-alive
Cache-Control: max-age=0, private, must-revalidate
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
X-Runtime: 0.433854
X-Request-Id: f46a0e87-6969-4285-9b80-da0223edac01
X-Powered-By: Phusion Passenger 5.1.5
Status: 200 OK

49
{"device_attributes":[{"id":"85","value":"35"},{"id":"80","value":"65"}]}
0
(extra empty line)

我说的是数字49,它是十六进制的,似乎是JSON字符串的长度。之后它跟随0空行。

Wireshark screenshot which shows the response

首先,我想问一下,有效的HTTP响应是什么样的? 我认为在标题之后,跟随一个空行然后是响应主体,然后没有。

第二个为什么rails会这样做,如果有办法改变它。我认为rails会这样做,因为我从apache + phusion passengerpuma得到相同的响应。此外,我尝试了一些其他代码,与rails无关,以及我之前解释过的HTTP响应,而不是rails。

1 个答案:

答案 0 :(得分:0)

我没有找到我正在寻找的答案,但为了删除额外信息的解决方法是呈现如下:

render plain: ActiveSupport::JSON.encode({ result: :ok })

这项工作确实将content-type设置为'text / plain'而不是'application / json'。如果将render-options中的content-type设置为'application / json',则会再次显示此额外信息。

所以我认为这与json渲染器模块有关,但我现在不能再研究它了。