声明:本人是在实习项目的时候遇到的问题,所有方法均写在Impl中。
1. 申请百度AK
登录百度账号,没有的可以快速注册一个,傻瓜式流程,上传身份证照片即可。
点击创建应用,默认的都不动,确保我们要的“逆地理编码”已勾选。(这里说明一点,百度的api不断在更新,如果某一天你发现你的AK取调用某个API的时候报错:{"status":240,"message":"APP 服务被禁用"},可以尝试重新申请一个AK,亲测有效!)
IP白名单记得写,嫌麻烦全写0就行
2. 调用接口发送请求
话不多说,直接上代码(看注释)。构建url的时候注意,是纬度(latitude)在前,经度(longitude)在后(也就是小的在前,大的在后)。
// 逆地理编码,通过经纬度找具体地址
// 我的项目中经纬度是BigDecimal的,具体以自己的经纬度的变量类型决定
public String getLocationByCoordinates(BigDecimal longitude, BigDecimal latitude) throws IOException {
// 构建请求URL
String url = "https://api.map.baidu.com/reverse_geocoding/v3/?ak=你的ak&output=json&coordtype=wgs84ll&location="
+ latitude + "," + longitude;
// 创建URL对象
URL apiUrl = new URL(url);
// 打开连接
HttpURLConnection connection = (HttpURLConnection) apiUrl.openConnection();
// 设置请求方法
connection.setRequestMethod("GET");
// 获取响应代码
int responseCode = connection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
// 读取响应内容
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
reader.close();
// 解析JSON获取地址信息
// 通过打断点,查看返回值之后,对json数据进行解析
JSONObject jsonResponse = JSONObject.parseObject(response.toString());
JSONObject result = jsonResponse.getJSONObject("result");
JSONObject addressComponent = result.getJSONObject("addressComponent");
String formattedAddress = addressComponent.getString("province") +
addressComponent.getString("city") +
addressComponent.getString("district") +
addressComponent.getString("town");
return formattedAddress;
} else {
// 响应错误
// 引用这个方法会要求抛IO异常,建议第一次引用就try catch掉,以免以后一直往外抛
throw new IOException("HTTP response code: " + responseCode);
}
}
3. 处理返回值
打了断点之后,查看返回值类型。如果不做处理的话,会因为插入的数据长度超过了数据库定义的长度限制,导致数据被截断而无法插入。
这里我们取"province,city,district,town"这几个key。代码见上。
4. 结果
这里我是先写入数据库,再用前端发请求,请求回来数据,所以表明已经成功写入数据库。