Java 生成有效的URL Google Places API

Java 生成有效的URL Google Places API,java,google-maps,google-api,Java,Google Maps,Google Api,我正在开发一个应用程序,它必须执行GooglePlacesAPI请求 我在以下网站上获得了私钥: 客户端ID:xxxxxxxxxx.apps.googleusercontent.com 客户端密码:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy 我正在使用以下代码生成URL: public class UrlSigner { // Note: Generally, yo

我正在开发一个应用程序,它必须执行GooglePlacesAPI请求

我在以下网站上获得了私钥:

客户端ID:xxxxxxxxxx.apps.googleusercontent.com

客户端密码:yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy

我正在使用以下代码生成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给出以下错误:

  • 那是个错误。 在此服务器上找不到请求的URL/maps/api/place/search/json?(…)。我们只知道这些
  • 我试图通过XXXXXXXXXX更改ClientID(XXXXXXXXXX.apps.googleusercontent.com),但它仍然不起作用。有人知道我做错了什么吗


    多谢各位

    问题是,您在google端没有到达任何端点。即使没有地方api服务收到您的请求

    尝试使用以下URL字符串:

    private static String urlString = "http://maps.googleapis.com/maps/api/place/search/json?location=..."
    
    重要的区别在于
    googleapis
    而不是
    google
    。在浏览器中键入您创建的url,然后您将看到,您得到了一些json(即使它是一个被拒绝的请求)。然后您就知道您的应用程序到达了一个api端点


    编辑:我认为谷歌最近已经将域名改为GoogleAppis。您使用的西班牙语文档使用
    google
    ,英语文档使用
    googleapis
    。我认为西班牙文件不是最新的。也许你会将这些信息发布到谷歌(也许在论坛上)

    问题是你在谷歌方面没有达到终点。即使没有地方api服务收到您的请求

    尝试使用以下URL字符串:

    private static String urlString = "http://maps.googleapis.com/maps/api/place/search/json?location=..."
    
    重要的区别在于
    googleapis
    而不是
    google
    。在浏览器中键入您创建的url,然后您将看到,您得到了一些json(即使它是一个被拒绝的请求)。然后您就知道您的应用程序到达了一个api端点


    编辑:我认为谷歌最近已经将域名改为GoogleAppis。您使用的西班牙语文档使用
    google
    ,英语文档使用
    googleapis
    。我认为西班牙文件不是最新的。也许你会将这些信息发布到谷歌(也许在论坛上)

    你完全正确,从现在起我将使用英文文档,非常感谢!你完全正确,从现在起我将使用英文文档,非常感谢!