HTTP Get语句以{in URL}停止

时间:2013-10-26 21:25:05

标签: java android json http-get

我正在尝试使用MapQuest API。 API有点搞笑,需要JSON字符串作为输入。当这段代码执行时,我已经验证了链接在一起的URL是正确的,但是在调用HTTPGet(url.toString())后我从未进入Log.v语句。我做了一些研究,发现这可能是由于缺少证书造成的,但我只使用http连接,而不是https。当然在httpGet之后还有更多的工作要做,但我只发布了相关的代码。不会抛出任何错误,代码只是简单地停止执行。我使用了基本相同的代码,只是稍微不同的URL用于解析其他RESTFUL API。有什么想法吗?

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

编辑:根据建议,我将代码卡在try catch中,并获得此堆栈跟踪(仅修改以删除我的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}}}

2 个答案:

答案 0 :(得分:1)

根据URI规范(RFC 3986),大括号字符既不是“保留字符”也不是“未保留字符”。这意味着如果它们是“百分比编码”,它们只能用于URL(或任何其他类型的URI)。

您的网址包含普通(未编码)大括号字符。根据规范,这是无效的......这就是HttpGet构造函数抛出异常的原因。

Pearson的回答提供了一种创建合法URL的可能方法。另一种方法是使用URI对象组装URL; e.g。

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中的具体细节。 (仔细阅读!)

答案 1 :(得分:0)

问题是使用{在HTTP get中是非法的。解决方案是通过“安全URL编码器”运行URL。根据{{​​3}},诀窍是确保您只通过需要它的网址部分运行它,并且不包含&http://等内容。 / p>

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"));

更好的解决方案是,使用Mapquest的非JSON输入API。输出仍然是JSON。

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