原来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-cors 和 kaminari, 将借用这两个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相关信息: