【问题标题】:How to send 206 status code when using active_model_serializer gem and Rails API and will_paginate/kaminari使用 active_model_serializer gem 和 Rails API 和 will_paginate/kaminari 时如何发送 206 状态码
【发布时间】:2019-02-26 15:36:27
【问题描述】:

我正在使用 AMS、Rails 5.2.2 API 和 will_paginate gem。它可以根据需要工作,但响应代码是 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

其中json_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-serializers rails-api


    【解决方案1】:

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

    2.2.12.4 :status 选项 Rails 将自动生成带有正确 HTTP 状态代码的响应(在大多数情况下,这是 200 好的)。您可以使用 :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 标头中所述。

    所以我认为主要取决于您的应用程序。

    【讨论】:

    • 是的,这些我都知道。诀窍是您必须手动管理状态代码,以防响应是否分页,例如,如果@addresses.size 超过 25 - 您使用206 状态(:partial_content)进行响应,如果不是,你发送200(:ok)。
    【解决方案2】:

    我想到的解决方案是向controllers/concerns/response.rb 添加一个辅助方法,以便能够为分页响应返回正确的状态:

    def paginated_response_status(collection)
      collection.size > WillPaginate.per_page ? :partial_content : :ok
    end
    

    并在需要时在AdressesController 操作中使用它:

    #controllers/api/addresses_controller.rb
    
    def index
      @addresses = Address.all
      paginate(
        json: @addresses, 
          include: ['shop', 'shop.country'],
          status: paginated_response_status(@addresses) 
      )
    end
    

    以上示例适用于will_paginate gem 和api-pagination gem。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-01-01
      • 1970-01-01
      • 2012-07-18
      • 2023-03-28
      • 2013-12-03
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      相关资源
      最近更新 更多