2011-10-13 95 views
2

我正在开发一个必须执行Google Places API请求的应用程序。生成有效的网址Google Places API

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

我得到了以下网站上的私人密钥:

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

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

客户端的秘密:YYYYYYYYYYYYYYYYYY(它看起来像vNIXE0xscrmjlyV-12Nj_BvUPaw =)

我使用此代码生成该中心提供全方位网址:

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; 
    } 
} 

的代码工作正常:它返回一个网址,但该网址提供了这个错误:

  1. That’s an error. The requested URL /maps/api/place/search/json?.(...) was not found on this server. That’s all we know.

我试图改变客户端ID(XXXXXXXXXXX.apps.googleusercontent.com)由XXXXXXXXXXX但它仍然无法正常工作。任何人都知道我在做什么错了?

非常感谢!

回答

0

问题是你没有达到谷歌端点。即使没有地方,api服务得到您的请求。

尝试使用以下urlString:

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

的重要区别是googleapis而不是google。在浏览器中输入你创建的url,你会看到,你得到了一些json(即使它是拒绝的请求)。然后你知道你已经达到了api-endpoint。

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

+0

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