2013-10-26 1 views
0

Я пытаюсь использовать API MapQuest. API немного забавный, требующий ввода строки JSON. Когда этот код выполняется, я проверил, что URL-адрес правильный, который натянут вместе, но я никогда не попадаю в оператор Log.v после вызова HTTPGet(url.toString()). Я провел некоторое исследование и вижу, что это может быть вызвано отсутствием сертификатов, но я использую только http-соединение, а не https. Конечно, после httpGet выполняется больше работы, но я только разместил соответствующий код. Ошибка никогда не возникает, код просто прекращает выполнение за пределами этого. Я использовал по существу тот же код, только несколько разные URL-адреса для анализа других RESTFUL API. Есть предположения?HTTP Get statement останавливается с {в URL

private JSONObject callMapQuestGeoCoder(Location location) 
{ 
String APIkey=decryptKey(MapQuestEncryptedKey); 
StringBuilder url=new StringBuilder(); 
url.append("http://open.mapquestapi.com/geocoding/v1/reverse?key="+APIkey); 
url.append("&callback=renderReverse"); 
url.append("&json={location:{latLng:{lat:"+location.getLatitude()); 
url.append(",lng:"+location.getLongitude()); 
url.append("}}}"); 
HttpGet httpGet = new HttpGet(url.toString()); 
Log.v(TAG,""+httpGet); 

EDIT: За советами, я застрял код в попытке поймать, и получил эту трассировку стеки (Modified только удалить мой ключ API, и немного изменить местоположение). Символ, который недопустим, является символом {.

10-26 17:42:58.733: E/GeoLoc(19767): Unknown Exception foundjava.lang.IllegalArgumentException: Illegal character in query at index 117: http://open.mapquestapi.com/geocoding/v1/reverse?key=API_KEY&callback=renderReverse&json={location:{latLng:{lat:33.0207687439397,lng:-74.50922234728932}}} 
+1

Две вещи, которые я хотел бы проверить: положите попытку поймать все это и посмотрите, попадет ли sth или увидит, если вы столкнулись с проблемой ограничения использования API, описанной на http://stackoverflow.com/questions/16965582/node-js-http-get-hangs-after-5-request-to-remote-site – mico

+0

@mico: Это не ограничения API, я перевел вызов, прежде чем другие произойдут. Однако я нашел исключение, которое нигде не было поймано. Хммм ... Кажется, проблема в том, что {. – PearsonArtPhoto

ответ

1

Согласно спецификации URI (RFC 3986), фигурные скобки символы не являются ни «зарезервированные символы» или «незарезервированная символы». Это означает, что они могут использоваться только в URL (или любом другом URI), если они «закодированы в процентах».

Ваш URL содержит простые (незакодированные) фигурные скобки. Это недопустимо в соответствии со спецификацией ... и поэтому конструктор HttpGet бросает исключение.

Ответ Пирсона дает один из возможных способов создания юридического URL-адреса. Другим было бы собрать URL-адрес, используя объект URI; например

url = new URI("http", "open.mapquestapi.com", "/geocoding/v1/reverse", 
       ("key=" + APIkey + "&callback=renderReverse" + 
       "&json={location:{latLng:{lat:" + location.getLatitude() + 
       ",lng:" + location.getLongitude() + "}}}"), 
       "").toString(); 

Мульти-аргумент URI конструкторов позаботиться о любом требуемом кодировании компонентов ... в соответствии с конкретными деталями в соответствующем javadocs. (Прочитайте их внимательно!)

0

Проблема заключается в том, что использование { является незаконным в получении HTTP. Решение состоит в том, чтобы запустить URL-адрес через «Безопасный URL-кодер». Хитрость, в this question, чтобы убедиться, что вы только запустить его через часть URL, который нуждается в этом, и не включают в себя такие вещи, как &, http:// и т.д.

url.append("http://open.mapquestapi.com/geocoding/v1/reverse?key="+APIkey); 
url.append("&callback=renderReverse"); 
url.append(URLEncoder.encode("&json={location:{latLng:{lat:"+location.getLatitude(),"UTF-8")); 
url.append(",lng:"+location.getLongitude()); 
url.append(URLEncoder.encode("}}}","UTF-8")); 

И даже лучшее решение, используйте API-интерфейс ввода не для JSON для Mapquest. Выходом по-прежнему является JSON.

url.append("http://open.mapquestapi.com/geocoding/v1/reverse?key="+APIkey); 
url.append("&lat="+location.getLatitude()); 
url.append("&lng="+location.getLongitude());