Rails API:Header中传递pagination

原来Header可以这么玩。

需求:

前端调用接口,需要后端返回指定页面的数据。由于之前的接口没有涉及到分页,需要做微调,前端调用接口时,传参数page。

比如:api/v2/users?page=2, 返回第二页的用户列表信息。

返回的分页信息要求放在header而不是body中。

解决方法

google到的解决思路是:

先在服务器端设置Access-Control-Expose-Headers,让前端调用接口时,可以拿到header信息。【如果不设置,前端通过response.header拿到的就只有cache-control, content-type.】

然后再将需要传递的分页信息,比如pageCount, perPage塞进response的header中即可。

一步步来。

后台Rails项目中,已经安装了gem:rack-corskaminari, 将借用这两个gem来完成这项工作。

Step1:

查看rack-cors文档,找到用于设置Access-Control-Expose-Headers的options expose

参考文档,修改Rack的配置,假定我们需要塞进header中的是:X-Pagination-Current-Page, X-Pagination-Page-Count, X-Pagination-Per-Page, X-Pagination-Total-Count

use Rack::Cors do
  allow do
    origins '*'
    resource '/public/*',
      headers: :any,
      methods: :any
      expose: ['X-Pagination-Current-Page', 'X-Pagination-Page-Count', 'X-Pagination-Per-Page', 'X-Pagination-Total-Count']
  end
end

重启服务器。

Step2:

kaminari的文档中,列出了current_page, total_pages等多个可以获取分页信息的方法。

以User的index 接口为例,修改users_controller.rb文件,在index部分的最后,添加如下代码:

def index
    .....
    if params[:page]
        @users = @users.page(params[:page])
        response.headers['X-Pagination-Current-Page'] = @users.current_page
        response.headers['X-Pagination-Page-Count'] = @users.total_pages
        response.headers['X-Pagination-Per-Page'] = @users.limit_value
        response.headers['X-Pagination-Total-Count'] = @users.total_count
    end
end

【鉴于其他接口也难免会涉及到分页,可以将这部分代码封装成一个方法,放在API的BaseController中,让所有继承该类的controllers可直接调用该方法。】

OK,搞定。

这时前端调接口,可以看到获取的header中含有pagination相关信息: