Создать действительный URL Google Places API - PullRequest
2 голосов
/ 13 октября 2011

Я занимаюсь разработкой приложения, которое должно выполнить запрос API Google Адресов.

http://code.google.com/intl/es/apis/maps/documentation/places/

Я получил закрытый ключ на следующем веб-сайте:

https://code.google.com/apis/console

Идентификатор клиента: XXXXXXXXXXX.apps.googleusercontent.com

Секрет клиента: ГГГГГГГГГГГГГ (выглядит как vNIXE0xscrmjlyV-12Nj_BvUPaw =)

Я использую этот код для генерации URL:

public class UrlSigner {

  // Note: Generally, you should store your private key someplace safe
  // and read them into your code

  private static String keyString = "YYYYYYYYYYYYYYYYYY";

  // The URL shown in these examples must be already
  // URL-encoded. In practice, you will likely have code
  // which assembles your URL from user or web service input
  // and plugs those values into its parameters.
  private static String urlString = "http://maps.google.com/maps/api/place/search/json?location=40.717859,-73.957790&radius=1600&client=XXXXXXXXXXX.apps.googleusercontent.com&sensor=false";

  // This variable stores the binary key, which is computed from the string (Base64) key
  private static byte[] key;

  public static void main(String[] args) throws IOException,
    InvalidKeyException, NoSuchAlgorithmException, URISyntaxException {

    // Convert the string to a URL so we can parse it
    URL url = new URL(urlString);

    UrlSigner signer = new UrlSigner(keyString);
    String request = signer.signRequest(url.getPath(),url.getQuery());

    System.out.println("Signed URL :" + url.getProtocol() + "://" + url.getHost() + request);
  }

  public UrlSigner(String keyString) throws IOException {
    // Convert the key from 'web safe' base 64 to binary
    keyString = keyString.replace('-', '+');
    keyString = keyString.replace('_', '/');
    System.out.println("Key: " + keyString);
    this.key = Base64.decode(keyString);
  }

  public String signRequest(String path, String query) throws NoSuchAlgorithmException,
    InvalidKeyException, UnsupportedEncodingException, URISyntaxException {

    // Retrieve the proper URL components to sign
    String resource = path + '?' + query;

    // Get an HMAC-SHA1 signing key from the raw key bytes
    SecretKeySpec sha1Key = new SecretKeySpec(key, "HmacSHA1");

    // Get an HMAC-SHA1 Mac instance and initialize it with the HMAC-SHA1 key
    Mac mac = Mac.getInstance("HmacSHA1");
    mac.init(sha1Key);

    // compute the binary signature for the request
    byte[] sigBytes = mac.doFinal(resource.getBytes());

    // base 64 encode the binary signature
    String signature = Base64.encodeBytes(sigBytes);

    // convert the signature to 'web safe' base 64
    signature = signature.replace('+', '-');
    signature = signature.replace('/', '_');

    return resource + "&signature=" + signature;
  }
}

Код работает нормально: он возвращает URL, но URL выдает эту ошибку:

  1. Это ошибка. Запрашиваемый URL / maps / api / place / search / json?. (...) не найден на этом сервере. Это все, что мы знаем.

Я пытался изменить ClientID (XXXXXXXXXXX.apps.googleusercontent.com) на XXXXXXXXXXX, но он все еще не работает. Кто-нибудь знает, что я делаю не так?

Большое спасибо!

1 Ответ

0 голосов
/ 16 октября 2011

Проблема в том, что вы не достигли конечной точки на стороне Google. Даже нет мест-API-сервис получил ваш запрос.

попробуйте использовать следующую строку urlString:

private static String urlString = "http://maps.googleapis.com/maps/api/place/search/json?location=..."

важное отличие - googleapis вместо google. Введите созданный вами URL в ваш браузер, и вы увидите, что вы получаете немного JSON (даже если это отказанный запрос). Тогда вы знаете, что вы достигли конечной точки API.

edit : Я думаю, что Google недавно изменил домен на googleapis. Используемая вами испанская документация использует google, а английская документация - googleapis. Я думаю, что испанская документация не актуальна. Может быть, вы публикуете эту информацию в Google (может быть, на форуме)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...