【问题标题】:Issue with Google Places API - INVALID REQUESTGoogle Places API 问题 - 无效请求
【发布时间】:2012-03-20 08:59:53
【问题描述】:

目前我的代码遇到问题,在过去 3 天内,我无法使用 Google Places API 成功完成删除请求,记录在 here

直到周日,只要请求的地点满足 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;
}

【问题讨论】:

  • 我刚刚在 JSON 请求中遇到了这个问题,因为文档中的地点 ID 键应该是“place_id”而不是“placeid”。在这里查看我的答案:stackoverflow.com/a/28287549/4448436
  • placeid 可以与 Google API 文档的示例链接一起正常工作。但它不适用于我获得的 ID。我对两者都使用相同的 API 密钥。

标签: java google-places-api


【解决方案1】:

就我个人而言,我收到了对我的 Google API 请求的 INVALID_REQUEST 响应,因为它们之间的间隔不够。我必须在它们之间插入 2 秒钟的睡眠才能让它们工作。

【讨论】:

  • 你是救世主。我被困了 2 天试图调试错误。
【解决方案2】:

尝试按照文档的建议刷新您的参考: https://developers.google.com/maps/documentation/places/

建议定期为 Places 存储引用 更新了。

【讨论】:

  • 在我当前的测试中,我在创建地点后运行此删除方法,使用从创建请求传回的引用。 Google 会这么快更改他们的参考资料吗?
  • 对同一个地方的引用永远不会相同,但应该始终指向同一个地方。由于 Places API 仍处于开发和实验阶段,建议更新存储的引用以避免 API 更改时出现任何问题。您描述的方法应该可以正常工作,引用不应该那么快改变。
【解决方案3】:

这对我有用:

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

【讨论】:

    【解决方案4】:

    发生在我身上的另一种情况是,我存储 Google 参考 ID 的数据类型是 string(限制为 255 个字符),将列数据类型更改为 text 修复了所有问题。 INVALID_REQUEST 响应通常来自错误的引用调用。 Google 还可以延长参考 ID 的长度,您不会知道它没有正确保存到数据库中。

    【讨论】:

      【解决方案5】:

      我假设您已将 API_KEY_HERE 替换为您的 API 密钥。尝试在developer console 中获取新密钥,并确保您的“允许的 IP 地址”设置正确。

      【讨论】:

        【解决方案6】:

        我做错了,我使用的是 Google 的 'id' 属性,但事实证明还有一个 'place_id',你必须使用 place_id,而不是 'id'。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-12-26
          • 1970-01-01
          • 2012-09-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多