Как добавить дополнительные заголовки и токен для каждого запроса плитки - PullRequest
0 голосов
/ 25 февраля 2019

Мы используем mapbox gl js с нестандартными поставщиками плиток, и плитки защищены токеном.В нашем случае каждая плитка будет иметь свой собственный токен и получаться по запросу AJAX.Чтобы добиться этого, я попытался использовать опцию tranformRequest , как показано ниже, но ни один из них не работает

Метод 1 Возвращение обещания

var map = new mapboxgl.Map({
    container: 'map',
    style: 'https://www.example.com/styles/streets/style.json',
    center: [53.33, 24.5],
    zoom: 8,
    transformRequest: function(url, resourceType) {
        if(resourceType !== 'Tile') {
            return {
                url: url,
            };
        }

        return axios.get('../api/get-token.php', {
            params: {
                AccessURL: url
            },
            headers: {
                'X-Requested-With': 'XmlHttpRequest'
            }
        }).then(function (response) {
            return {
                url: url,
                headers: {
                    'X-Requested-With': 'XmlHttpRequest'
                    'token': response.data.token
                }
            }
        });
    }
});

Способ 2 асинхронный / ожидание

var map = new mapboxgl.Map({
    container: 'map',
    style: 'https://www.example.com/styles/streets/style.json',
    center: [53.33, 24.5],
    zoom: 8,
    transformRequest: async function(url, resourceType) {
        if(resourceType !== 'Tile') {
            return {
                url: url,
            };
        }

        try {
            const response = await axios.get('../api/get-token.php', {
                params: {
                    AccessURL: url
                },
                headers: {
                    'X-Requested-With': 'XmlHttpRequest'
                }
            });
            return {
                url: url,
                headers: {
                    'X-Requested-With': 'XmlHttpRequest'
                    'token': response.data.token
                }
            };
        } catch (error) {
            return {
                url: url,
            };
        }
    }
});

Как я могу достичь этого случая?Существуют ли какие-либо опции в библиотеке mapbox gl js или какие-либо обходные пути?

1 Ответ

0 голосов
/ 26 февраля 2019

Я не верю, что transformRequest может принять асинхронный параметр, такой как обещание.Он ожидает вызова функции и немедленного получения объекта, содержащего URL-адрес и заголовки:

{
...
transformRequest: function transformRequest(url, resourceType) {
        if (resourceType === 'Tile' && url.match('...')) {
            return {
                url: url,
                headers: { 'Authorization': 'Basic ' + btoa('MyPassword') }
            };
        }
    }

Если в вашем случае использования действительно требуется уникальный маркер аутентификации для каждой отдельной плитки (что кажется ... необычным!), Тогда яЯ не знаю метод, который будет работать.

...