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:/,如下:

Screen-Shot-2017-09-06-at-8.51.49-AM.png

为此,我通过分析 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}"
    );
}
原文地址:https://www.cnblogs.com/mouseleo/p/10831094.html