Laravel dingo,HTTP的请求头(accept)无法携带版本号的解决方法

使用 Laravel dingo 做api开发时,涉及 API 的多版本控制,dingo 允许在 HTTP请求的 header [Accept] 中,指定版本号。形式如 application/vnd.subtype.v2+json

但比如H5前端使用axios,官方github中虽然说明可以设置 options,但我们实际测试中,特殊的 PUT, DELETE 这些method 都是被覆盖为 Accept:/,如下:

Laravel dingo,HTTP的请求头(accept)无法携带版本号的解决方法

为此,我通过分析 dingo 实现代码,找到了一个 hack 形式的 workaround,在请求没有进入路由 和 中间件的处理前,把 header 用请求参数中的版本号覆盖,前端请求url 带上版本号参数,如?version=v2。

代码放在 routes.php 的最开头位置,如下:

// workaround: header['accept'] overwrite
$params = $api->getCurrentRequest()->query->all();
if (isset($params['version']) && $params['version'] == 'v2') {
$tree = config('api.standardsTree');
$subtype = config('api.subtype');
$format = config('api.defaultFormat'); // string like: application/vnd.subtype.v2+json
$api->getCurrentRequest()->server->set(
'HTTP_ACCEPT',
"application/${tree}.${subtype}.${params['version']}+${format}"
);
}

版权属于: 扣丁禅师

原文地址: http://www.yinqisen.cn/blog-778.html

转载时必须以链接形式注明原始出处及本声明。

上一篇:iOS9中请求出现App Transport Security has blocked a cleartext HTTP (http://)


下一篇:nuxt 的一些报错和插件推荐