2012-06-26 4 views
2

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

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

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

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

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

Это то, что мой текущий (работает на 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 

Заранее благодарен!

ответ

0

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

HTTP GET with request body

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

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); 
} 
+0

Это действительно решает сообщение ACCESS_DENIED (и объясняет, почему он не работал, Я бы добавил +1, если бы мой представитель был достаточно высоким!), Но он более или менее такой же, как мой первый (95% рабочий) фрагмент кода. Это не решает проблему слишком долгого URL-адреса GET из-за огромного ссылочного параметра. – Lawrence

Смежные вопросы