Ошибка запроса сведений о месте – слишком длинная ссылка

У меня есть небольшое Java-приложение, которое, учитывая список ссылок на места Google, должно возвращать идентификаторы для каждого из указанных мест Google (короче говоря, мы хранили ссылки на места вместо их идентификаторов, и только теперь поняли, что ссылки не уникальны для каждого места).

Мое приложение отлично работает примерно для 95% мест в списке, но для некоторых записей происходит сбой с кодом состояния «NOT_FOUND». Некоторые исследования показывают, что ссылка на место для этих конкретных мест (в сочетании с https://maps.googleapis.com/maps/api/place/details/json?sensor=false&key=myApiKey) примерно на 2 символа длиннее URL-адреса. Последние пару символов усекаются.

Моя первоначальная мысль заключалась в том, что я просто сделаю запрос POST к API мест Google, но я получаю код состояния «REQUEST_DENIED» с серверов Google при отправке того же, что и запрос POST.

В любом случае, это связано с этим, или это просто возникающая ошибка с API мест Google (теперь, когда количество мест слишком сильно увеличило ссылку?).

Я также должен отметить, что все неудачные места недавно добавлены нашим приложением.

Вот как выглядит мой текущий (работающий на 95%) код:

public static JSONObject getPlaceInfo(String reference) throws Exception
{
URL places = new URL("https://maps.googleapis.com/maps/api/place/details/json?sensor=false&key="+apiKey+"&reference="+reference);
    URLConnection con = places.openConnection();
    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    StringBuffer input = new StringBuffer();
    String inputLine;
    while ((inputLine = in.readLine()) != null) 
        input.append(inputLine);
    in.close();

    JSONObject response = (JSONObject) JSONSerializer.toJSON(input.toString());
    return response;
}

и вот как выглядит мой почтовый индекс «ACCESS_DENIED»:

public static JSONObject getPlaceInfo(String reference) throws Exception
{
    String data = URLEncoder.encode("sensor", "UTF-8") + "=" + URLEncoder.encode("true", "UTF-8");
    data += "&" + URLEncoder.encode("key", "UTF-8") + "=" + URLEncoder.encode(apiKey, "UTF-8");
    data += "&" + URLEncoder.encode("reference", "UTF-8") + "=" + URLEncoder.encode(reference, "UTF-8");

    URL places = new URL("https://maps.googleapis.com/maps/api/place/details/json");
    URLConnection con = places.openConnection();

    con.setDoOutput(true);
    OutputStreamWriter wr = new OutputStreamWriter(con.getOutputStream());
    wr.write(data);
    wr.flush();

    BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
    StringBuffer input = new StringBuffer();
    String inputLine;
    while ((inputLine = in.readLine()) != null) 
        input.append(inputLine);
    in.close();

    JSONObject response = (JSONObject) JSONSerializer.toJSON(input.toString());
    return response;
}

Пример неудачной ссылки:

CnRtAAAAxm0DftH1c5c6-krpWWZTT51uf0rDqCK4jikWV6eGfXlmKxrlsdrhFBOCgWOqChc1Au37inhf8HzjEbRdpMGghYy3dxGt17FEb8ys2CZCLHyC--7Vf1jn-Yn1kfZfzxznTJAbIEg6422q1kRbh0nl1hIQ71tmdOVvhdTfY_LOdbEoahoUnP0SAoOFNkk_KBIvTW30btEwkZs

Заранее спасибо!


person Lawrence    schedule 26.06.2012    source источник


Ответы (1)


Вы отправляете параметры запроса в теле, что не поддерживается API. Хороший ответ о GET и параметрах запроса:

HTTP GET с телом запроса

Следующий код должен работать для запросов сведений о месте:

private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place";
private static final String TYPE_DETAILS = "/details";
private static final String OUT_JSON = "/json";

HttpURLConnection conn = null;
StringBuilder jsonResults = new StringBuilder();
try {
    StringBuilder sb = new StringBuilder(PLACES_API_BASE);
    sb.append(TYPE_DETAILS);
    sb.append(OUT_JSON);
    sb.append("?sensor=false");
    sb.append("&key=" + API_KEY);
    sb.append("&reference=" + URLEncoder.encode(reference, "utf8"));

    URL url = new URL(sb.toString());
    conn = (HttpURLConnection) url.openConnection();
    InputStreamReader in = new InputStreamReader(conn.getInputStream());

    // Load the results into a StringBuilder
    int read;
    char[] buff = new char[1024];
    while ((read = in.read(buff)) != -1) {
        jsonResults.append(buff, 0, read);
    }
} catch (MalformedURLException e) {
    return null;
} catch (IOException e) {
    return null;
} finally {
    if (conn != null) {
        conn.disconnect();
    }
}

try {
    // Create a JSON object hierarchy from the results
    JSONObject jsonObj = new JSONObject(jsonResults.toString()).getJSONObject("result");
    jsonObj.getString("name");
} catch (JSONException e) {
    Log.e(LOG_TAG, "Error processing JSON results", e);
}
person saxman    schedule 25.07.2012
comment
Это решает сообщение ACCESS_DENIED (и объясняет, почему это не сработало, я бы +1, если бы моя репутация была достаточно высокой!), но это более или менее то же самое, что и мой первый (95% рабочий) фрагмент кода. Это не решает проблему слишком длинного URL-адреса GET из-за огромного ссылочного параметра. - person Lawrence; 26.07.2012