2012-03-20 4 views
7

В настоящее время у меня возникает проблема с моим кодом, где за последние 3 дня мне не удалось успешно выполнить запросы на удаление с использованием API Google Адресов, задокументированных here.Проблема с API Google Places - НЕВЕРНЫЙ ЗАПРОС

Вплоть до воскресенья этот код будет выполняться и запускаться без проблем, если запрашиваемое место удовлетворяет условиям API, и только полученные ответы были в форме OK или REQUEST_DENIED.

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

Может ли кто-нибудь еще просмотреть этот код и сообщить мне, есть ли проблемы по сравнению с связанным API?

public boolean delete(String reference) 
{ 
    try 
    { 
     System.out.println(reference); 
     String url = "https://maps.googleapis.com/maps/api/place/delete/xml?sensor=false&key=API_KEY_HERE"; 

     String data = "<PlaceDeleteRequest>\n<reference>" + reference + "</reference>\n</PlaceDeleteRequest>"; 
     System.out.println(data); 

     URL xmlUrl = new URL(url); 
     HttpPost request = new HttpPost(xmlUrl.toURI()); 
     request.setEntity(new StringEntity(data)); 

     HttpClient client = new DefaultHttpClient(); 
     HttpResponse response = client.execute(request); 
     HttpEntity entity = response.getEntity(); 

     BufferedReader input = new BufferedReader(new InputStreamReader(entity.getContent())); 

     String line = ""; 

     while ((line = input.readLine()) != null) 
     { 
      System.out.println(line); 
      if (line.contains("<status>")) 
      { 
       String[] s1 = line.split(">"); 
       String[] s2 = s1[1].split("<"); 
       if (s2[0].equalsIgnoreCase("ok")) 
       { 
        return true; 
       } 
       else 
       { 
        return false; 
       } 
      } 
     } 

     input.close(); 

    } 
    catch(Exception e) 
    { 
     return false; 
    } 
    return false; 
} 
+0

Я просто столкнулся с этой проблемой с запросом JSON, потому что ключ идентификатора места в документации должен быть «place_id», а не «placeid». См. Мой ответ здесь: http://stackoverflow.com/a/28287549/4448436 –

+0

placeid отлично работает с образцом ссылки doc Google API. Но это не работает с моим полученным идентификатором. Я использую те же ключи API для обоих. – Talha

ответ

0

Я предполагаю, что вы заменили API_KEY_HERE вашим ключом API. Попробуйте получить новый ключ в developer console и убедитесь, что настройки «разрешенного IP-адреса» верны.

+3

неправильный ключ API дает REQUEST_DENIED, а не INVALID_REQUEST. – djunod

0

Попробуйте обновить ссылку, как это рекомендовано в документации: https://developers.google.com/maps/documentation/places/

Рекомендуется сохраненные ссылки на места регулярно обновляется.

+0

В моем текущем тестировании я запускаю этот метод удаления после создания места, используя ссылку, полученную обратно из запроса на создание. Сможет ли Google быстро изменить свои ссылки? – forsterb01

+0

Ссылки на одно и то же место никогда не будут одинаковыми, но должны всегда указывать на одно и то же место. Поскольку API-интерфейс Places все еще находится в разработке и экспериментальном режиме, рекомендуется обновлять сохраненные ссылки, чтобы избежать любых проблем, если API изменится. Метод, который вы описали, должен работать правильно, ссылки не должны быстро меняться. –

0

Это работает для меня:

public String delete(String reference) { 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost("https://maps.googleapis.com/maps/api/place/delete/xml?sensor=false&key=YOUR_KEY_HERE"); 
    try { 
     StringEntity se = new StringEntity("<PlaceDeleteRequest>\n<reference>" + reference + "</reference>\n</PlaceDeleteRequest>", HTTP.UTF_8); 
     se.setContentType("text/xml"); 
     httppost.setEntity(se); 
     HttpResponse httpresponse = httpclient.execute(httppost); 
     HttpEntity resEntity = httpresponse.getEntity(); 
     return(EntityUtils.toString(resEntity)); 
    } catch (IOException e) { 
     return e.toString(); 
    } 
0

Другой сценарий, что случилось со мной, является то, что мой тип данных для того, где я хранил в Google Reference ID был string (ограничено до 255 символов), изменение типа данных столбца на text исправлено все. Ответ INVALID_REQUEST обычно происходит из-за плохого ссылочного вызова. Google также мог бы увеличить длину ссылочных идентификаторов, и вы не знали бы, что он не корректно сохраняет БД.

15

Лично я получил запрос INVALID_REQUEST к моим запросам Google API, потому что они не были достаточно разнесены друг от друга. Мне пришлось вставить сон в течение 2 секунд между ними, чтобы они работали.

+0

Вы спаситель. Я застрял в течение 2 дней, пытаясь отладить ошибку. – Anirudh

Смежные вопросы