Проблема с запросом Get из таблиц Google Fusion

#javascript #jquery #google-api #google-fusion-tables

#javascript #jquery #google-api #google-fusion-tables

Вопрос:

У меня возникли проблемы с запросом таблиц Google Fusion с использованием HTTP-запроса. Если я вставлю URL-адрес из приведенного ниже запроса в браузере, он возвращается со списком, разделенным запятыми. Однако, когда я делаю это с помощью функции .get, как показано ниже, в параметре data ничего не возвращается.

Я довольно новичок в этом, поэтому буду признателен за любую помощь.

 function query(){
var jqxhr=$.get(
    "https://www.google.com/fusiontables/api/query?sql=SELECT Address FROM 914142 WHERE IsCustomer = 1",
    function success(data, textStatus){
alert(data);})}
  

Ответ №1:

Я некоторое время назад боролся с этим, и только сегодня днем опубликовал пример кода и рабочий пример того, как обрабатывать запросы Fusion Tables.

В двух словах, Марк совершенно прав в отношении той же политики происхождения (http://en.wikipedia.org/wiki/Same_origin_policy ), и был почти готов к его решению, за исключением одной детали — вам нужно указать тип данных «jsonp» с помощью $.get . Читайте дальше на странице jQuery .get.

Основываясь на вашем исходном примере, это должно сработать:

 function query(){
    var queryurl = "<your query url>";
    querytail = "amp;jsonCallback=?";

    var jqxhr=$.get(queryurl   querytail, queryHandler, "jsonp")
}

function queryHandler(data) {
    // display the first row of retrieved data
    alert(data.table.rows[0]);
}
  

Комментарии:

1. ПРИМЕЧАНИЕ: только что был анонсирован jsonpAPI для Fusion Tables.

Ответ №2:

Используйте JSONP и fusion следующим образом:

 function processData(json){
  for (var i, row; row=json.table.rows[i]; i  ){
    console.log(row)
  }
}

script = document.createElement("SCRIPT")
script.src = "https://www.google.com/fusiontables/api/query?sql=SELECT Address FROM 914142 WHERE IsCustomer = 1amp;jsonCallback=processData";
document.getElementsByTagName("HEAD")[0].appendChild(script);
  

Не тестировался, вы поняли идею? Не знаю, поддерживает ли ваша библиотека какую-либо полезную абстракцию.

Ответ №3:

Вероятно, вам не разрешен доступ к таблицам Google fusion из-за той же политики происхождения.

Некоторые способы решить эту проблему — передать запрос через прокси-сервер через ваш собственный сервер (работающий в том же домене, что и страница, которую вы обслуживаете) или запросить данные в JSONP.

Если вы добавите параметр jsonCallback=<callback name here> к вашему запросу Fusion Tables, то вы получите ответ в формате JSONP. Например, запрос:

 https://www.google.com/fusiontables/api/query?sql=SELECT Address FROM 914142 WHERE IsCustomer = 1amp;jsonCallback=foo
  

приводит к:

 foo({"table":{"cols":["Address"],"rows":[["3400 California Street, Suite 302, San Francisco, CA 94118"],["1200 Pacific Avenue, San Francisco, CA 94109"],["340 10TH Street, San Francisco, CA 94103"],["One Embarcadero Center, Lobby Level, San Francisco, CA 94111"],["2230 Third Street, San Francisco, CA 94107"],["490 Post St, Suite 430, San Francisco, CA 94102"],["530 Bush St. Suite 101, San Francisco, CA 94108"],["114 Sansome Street, Suite 715, San Francisco, CA 94104"],["3012 Steiner Street Suite A, San Francisco, CA 94123"],["199 Fremont St # 105, San Francisco, CA 94105"],["2007 Irving St., San Francisco, CA 94122"],["450 Sutter Suite 2518, San Francisco, CA 94108"],["275 Gough Street, San Francisco, CA 94102"],["450 Sutter Street Suite 1225, San Francisco, CA 94108"],["2675 Geary Blvd., Ste 400, San Francisco, CA 94118"],["332 Pine St # 505, San Francisco, CA 94104"]]}})
  

Эта статья от IBM должна помочь вам понять JSONP и как с ним работать:http://www.ibm.com/developerworks/library/wa-aj-jsonp1 /

Ответ №4:

Когда я подумал об этом, я понял, что самый простой способ запустить запрос через ваш собственный сервер — это буквально притвориться, что это был ваш собственный запрос, то есть сохраненный в файле.

Итак, я только что создал php-скрипт, который включал содержимое моего собственного домена

 <?php echo file_get_contents('http://www.sameoriginpolicydomain.com'); ?>
  

И это сделало свое дело, либо вызвав его из AJAX, либо напрямую. Вот то, что вы ищете:

 <?php echo file_get_contents('http://www.google.com/fusiontables/exporttable?query='.urlencode($_GET['query']).'amp;o=kmllinkamp;g='.$_GET['g']); ?>
  

Ответ №5:

Хотя ответ noiv11 действительно работает, он не распространяется на авторизацию для тех, кому интересно, поскольку вы не можете управлять заголовками с помощью JSONP. Для этого вам нужно будет использовать реальные заголовки для извлечения данных, поэтому это потребует небольшой работы с cURL и, следовательно, должно быть выполнено через сервер.

Вот полезный PHP-класс, который делает трюк: Клиент Fusion Tables PHP