0

我正在尝试使用 MapQuest API。API 有点搞笑,需要一个 JSON 字符串作为输入。执行此代码时,我已验证串在一起的 URL 是正确的,但在调用HTTPGet(url.toString()). 我做了一些研究,发现这可能是由于缺少证书造成的,但我只使用了 http 连接,而不是 https。当然在httpGet之后还有更多的工作要做,但是我只贴了相关的代码。不会抛出任何错误,代码只是简单地停止执行。我使用了基本相同的代码,只是用于解析其他 RESTFUL API 的 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);

编辑:根据建议,我将代码卡在 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}}}
4

2 回答 2

1

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

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

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

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

于 2013-10-26T22:54:35.767 回答
0

问题是{在 HTTP 获取中使用 是非法的。解决方案是通过“安全 URL 编码器”运行 URL。根据这个问题,诀窍是确保您只通过需要它的 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"));

更好的解决方案是为 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());
于 2013-10-26T21:56:05.670 回答