Geocode API HTTP响应返回null问题排查求助
先看你代码里最明显的错误——URL参数拼接错误!你构造URL的时候用了两个问号:
String url = "https://maps.googleapis.com/maps/api/geocode/json?address=" + address + "?key=" + key;
URL里第一个参数用?,后续所有参数都应该用&连接,所以这里的第二个?要改成&,否则API会把?key=xxx当成地址的一部分,根本识别不到你的API密钥,这大概率是导致返回null的主要原因!
除了这个问题,还有几个常见的坑需要你排查:
必须检查API返回的status字段
Geocode API的响应里一定会有status字段,只有当它的值是OK时,results数组才会有数据。如果是ZERO_RESULTS(地址无法匹配)、REQUEST_DENIED(密钥无效/权限不足)、OVER_QUERY_LIMIT(请求超限)这些状态,results要么是空数组要么是null,你直接去取getJSONObject(0)肯定会出问题。不要手动替换空格,用标准URL编码
你手动把空格换成%是不对的,正确的做法是用URLEncoder.encode(address, "UTF-8")来编码整个地址字符串,这样能处理所有特殊字符(比如逗号、括号、#等),避免地址格式错误导致API无法解析。确认API密钥的配置
检查你的密钥是否已经在Google Cloud控制台启用了Geocoding API,同时确认没有设置IP限制或者API调用配额不足,这些都会导致请求被拒绝,返回无结果。增加空值判断,避免崩溃
即使status是OK,也有可能results数组为空(虽然这种情况很少),所以在取第一个元素之前,要先判断数组长度是否大于0。
这里给你修正后的代码示例,把这些问题都处理了:
public CheckLocation(String address) { try { String key = "insert key"; // 用标准URL编码处理地址 String encodedAddress = URLEncoder.encode(address, "UTF-8"); // 修正URL参数拼接,用&连接key参数 String url = "https://maps.googleapis.com/maps/api/geocode/json?address=" + encodedAddress + "&key=" + key; URL urlObj = new URL(url); HttpURLConnection con = (HttpURLConnection) urlObj.openConnection(); con.setRequestMethod("GET"); con.setRequestProperty("User-Agent", "Mozilla/5.0"); int responseCode = con.getResponseCode(); System.out.println("\nSending 'GET' request to URL : " + url); System.out.println("Response Code : " + responseCode); BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); String inputLine; StringBuffer response = new StringBuffer(); while ((inputLine = in.readLine()) != null) { response.append(inputLine); } in.close(); JSONObject myResponse = new JSONObject(response.toString()); // 先检查status是否为OK String status = myResponse.getString("status"); if ("OK".equals(status)) { JSONArray results = myResponse.getJSONArray("results"); // 确保results数组不为空 if (results.length() > 0) { JSONObject firstResult = results.getJSONObject(0); JSONObject location = firstResult.getJSONObject("geometry").getJSONObject("location"); double latitude = location.getDouble("lat"); double longitude = location.getDouble("lng"); formattedAddress = firstResult.getString("formatted_address"); coordinates = latitude + "," + longitude; } else { System.out.println("No results found for the address"); } } else { System.out.println("API request failed with status: " + status); // 可以根据不同status做不同处理,比如超限了提示用户,密钥错误提示配置问题等 } } catch (Exception e) { e.printStackTrace(); } }
先把URL的问题改了,然后加上status检查和空数组判断,应该就能解决大部分返回null的情况了。如果还是有问题,看控制台输出的status是什么,就能定位具体原因了。
内容的提问来源于stack exchange,提问作者ricemvm

