2015-12-02 5 views
4

Я пытаюсь получить direction_in_traffic, который не возвращается с использованием обычных направлений api. Я обнаружил, что есть поле в distancematrix api, которое делает именно это.Google DistanceMatrix API

Этот код работает, когда я запускаю его из моей машины, но как только он-лайн, я вижу ошибки, связанные Access-Control-Allow-Origin

var durationInTraffic = function(from, to, mode, callback) { 
    var key = 'API-KEY'; 
    var address = 'https://maps.googleapis.com/maps/api/distancematrix/json?origins=' + from + '&destinations=' + to + '&key='+ key +'&travelmode=' + mode + '&departure_time=now'; 
    var req = new XMLHttpRequest(); 
    req.addEventListener('load', function(){ 
    if (typeof callback === 'function') { 
     callback(JSON.parse(this.responseText).rows[0].elements[0].duration_in_traffic.value); 
    } 
    }); 

    req.open('GET',address); 
    req.setRequestHeader('Access-Control-Allow-Origin','https://haroen.me'); 
    req.setRequestHeader('Access-Control-Allow-Headers','X-Requested-With'); 
    req.send(); 
}; 

Я создал ключ, но на вкладке domain verification кажется " забыть ", что добавили я добавил.

jsbin (что, очевидно, не будет работать, так как этот ключ не разрешен в этом домене, но я получаю ту же ошибку в своем собственном домене).

Полный код, который я пытаюсь это на виден на https://github.com/haroenv/maps-checker

Спасибо за вашу помощь!

+0

Может захотеть скрыть ваш ключ API, если он связан с вашей фактической учетной записью Google Dev. – Vlad

+0

Спасибо, не подумал об этом –

+0

, возможно, вы захотите изменить свой ключ, множество сайтов сосать SO сообщений/ревизий (как нажимает «editied ... назад» делает). Кроме того, вы не должны устанавливать заголовки CORS из клиентской JS, это заголовки ответов сервера. – dandavis

ответ

0

Так как @dandavis, предложенный в комментарии, причина, по которой это не сработало, заключается в том, что Google хочет, чтобы этот ответ был серверным. Мое обходное решение выглядит следующим образом: a php (или любое серверное решение), которое отражает запрос в Google. Пример такой реализации:

<?php 
echo file_get_contents('https://maps.googleapis.com/maps/api/distancematrix/json?origins=' . urlencode($_POST['from']) . '&destinations=' . urlencode($_POST['to']) . '&key='. urlencode(json_decode(file_get_contents('config.json'), true)['maps-key']) .'&mode=' . urlencode($_POST['mode']) . '&departure_time=now'); 
?> 

И затем я отправляю запрос на этот скрипт из моего основного клиентского сценария.