我正在尝试使用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}}}
答案 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());