首页 > 解决方案 > 使用 active_model_serializer gem 和 Rails API 和 will_paginate/kaminari 时如何发送 206 状态码

问题描述

我正在使用 AMS、Rails 5.2.2 API 和will_paginategem。它根据需要工作,但响应代码200不是206

#adsresses_controller

def index
  @addresses = Address.all.paginate(page: params[:page], per_page: 25)
  json_response(@addresses, :ok, include: ['shop', 'shop.country'])
end

wherejson_response只是在中定义的一个方法controllers/concerns/response.rb

module Response
  extend ActiveSupport::Concern

  def json_response(object, status = :ok, opts = {})
    response = {json: object, status: status}.merge(opts)
    render response
  end
...
end

问题是发送正确响应的最佳规则是什么 - 200 或 206 在分页响应的情况下?

谢谢你。

标签: active-model-serializersrails-api

解决方案


https://guides.rubyonrails.org/layouts_and_rendering.html

2.2.12.4 :status 选项 Rails 将自动生成带有正确 HTTP 状态代码的响应(在大多数情况下,这是 200 OK)。你可以使用 :status 选项来改变它:

render status: 500
render status: :forbidden

您的响应代码是

200

因为你用:ok.

您应该使用以下方法解决此问题:

json_response(@addresses, 206, include: ['shop', 'shop.country'])

或者

json_response(@addresses, :partial_content, include: ['shop', 'shop.country'])

https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/206

HTTP 206 Partial Content 成功状态响应代码表示请求已成功,并且正文包含请求的数据范围,如请求的 Range 标头中所述。

因此,我认为主要取决于您的应用程序。


推荐阅读