1

我正在构建一个 Java Web 应用程序,该应用程序需要https://developers.google.com/maps/documentation/geocoding/上定义的 google 地理编码服务。我的应用程序已全部设置并且一切正常,我现在正在尝试签署我的请求以允许 API 的其他功能,例如额外的费率限制计费等...

我遇到的问题是我似乎无法获得适用于地理编码 API 的正确客户端 ID 和密钥。我几乎使用了 Google API 控制台上 API Access 选项卡中的 id 和 key 的所有合理组合。为了测试我的凭据,我直接从 google 复制了 PHP 代码http://gmaps-samples.googlecode.com/svn/trunk/urlsigning/index.html 以确保我的请求得到正确签名。我观看了关于这个主题的谷歌开发者视频(https://www.youtube.com/watch?v=ODeXo7YIwVg),它显示这是为谷歌商业账户完成的,在阅读谷歌的 API 文档后,你似乎没有拥有一个使用地理编码服务的企业帐户,但是我似乎无法获得有效的客户 ID 和密钥来为我工作。有谁知道在非企业帐户上使用此服务的正确设置?还是有可能?(记住这是一个服务器到服务器的连接)

如果有人需要更多信息,请告诉我。我将不胜感激任何建议。

编辑:查看https://developers.google.com/maps/documentation/geocoding/#Limits上列出的使用限制,您会看到这意味着您可以在没有企业帐户的情况下使用地理编码 API ......但是如何?

4

1 回答 1

3

我浏览了文档,正如您正确指出的那样,您不需要企业帐户即可使用地理编码 API。如果您有非企业帐户,则只需传递 API 密钥。仅当您拥有企业帐户时才需要客户 ID。密钥本身是独一无二的,如下所述:

https://developers.google.com/console/help/#WhatIsKey

API 密钥是您使用控制台生成的唯一密钥。当您的应用程序需要调用此项目中启用的 API 时,应用程序会将此密钥作为 key=API_key 参数传递给所有 API 请求。使用此密钥不需要任何用户操作或同意,不授予对任何帐户信息的访问权限,也不用于授权。

根据下面的链接,在商业帐户的情况下使用客户 ID 而不是密钥。

https://developers.google.com/maps/articles/v2tov3#newkey

如果您是 Maps for Business 客户,则需要使用客户 ID 代替密钥。请注意,两者不能一起使用。客户端 ID 类似于密钥,但有以下区别:

  • 使用客户端 ID 的 Maps for Business 应用程序可能有权访问其他功能或限制,例如 Maps Analytics。您的客户端 ID 将由 Google Enterprise Support 提供给您。您不需要使用 API 控制台。

  • 加载 Google Maps JavaScript API 时,您将使用 client 参数而不是 key 参数。

我猜同样的原则也适用于 Geocoding API。如果您想要不属于非企业帐户的附加功能,则必须获得一个企业帐户。

我仅使用密钥运行以下代码以在 Java 中签署我的请求,它运行良好。

    public static String getAddress(String latitude, String longitude){
    String address = null;
    try {
        final String inputurl = "http://maps.googleapis.com/maps/api/geocode/xml?latlng="+ latitude + "," + longitude + "&sensor=true";
//          Sign the URL using key
        String url = getRequestURL(inputurl);
        url = "http://maps.googleapis.com" + url;

        final URL google = new URL(inputurl);
        final URLConnection geocode = google.openConnection();
        final BufferedReader in = new BufferedReader(new InputStreamReader(
                geocode.getInputStream()));
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            address += inputLine;
        }
        in.close();
    } catch (Exception e) {
        // TODO: handle exception
        e.printStackTrace();
    }
    return null;
}

public static String getRequestURL(final String inputurl) throws IOException,
InvalidKeyException, NoSuchAlgorithmException, URISyntaxException {
    // Convert the string to a URL so we can parse it
    final URL url = new URL(inputurl);

    final URLSigner signer = new URLSigner("*INSERT YOUR KEY HERE*");
    final String request = signer.signRequest(url.getPath(), url.getQuery());

    return request;
}
于 2013-07-24T09:42:36.863 回答