java调用高德地图api实现通过ip定位访问者的城市
所需东西:高德地图的key
注意:这个key是 web服务的key 和js的key不是一个key(若没有则自行创建,创建教程在文末)
高德地图的api文档:https://lbs.amap.com/api/webservice/guide/api/ipconfig/
新建工具类如下:
调用时传IP地址即可获取对应城市编码或其他信息
package com.test.utils.gaode; import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.test.commons.FailException; import java.io.*;
import java.net.URL;
import java.nio.charset.Charset; public class GdUtil { private static final String KEY = "17abf77d3c69e0d16c02e764f4fe6be4"; //web服务的key private static String readAll(Reader rd) throws IOException {
StringBuilder sb = new StringBuilder();
int cp;
while ((cp = rd.read()) != -1) {
sb.append((char) cp);
}
return sb.toString();
} private static JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
InputStream is = new URL(url).openStream();
try {
BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
String jsonText = readAll(rd);
JSONObject json = JSONObject.parseObject(jsonText);
return json;
} finally {
is.close();
}
} public static String getCityCodeByIp(String ipAddress) {
JSONObject json = null;
String adCode = "";
try {
json = readJsonFromUrl("http://restapi.amap.com/v3/ip?ip=" + ipAddress + "&key=" + KEY + "");
if ("0".equals(json.getString("status"))){ //调用异常时,抛出返回信息,以便分析(我会在错误层统一捕获并输出到error日志)
throw new FailException("调用高德返回异常: " + json.toJSONString());
}
} catch (IOException e) {
e.printStackTrace();
throw new FailException("高德获取城市编码:", e);
}
adCode = json.getString("adcode"); //获取ip定位的城市编码(高德返回json如下,需要其他也可自行获取)
return adCode;
} public static void main(String[] args) {
String s = GdUtil.getCityCodeByIp("60.191.12.10");
System.out.println(s); // }
}
高德返回json的格式如下(根据需要自行获取):
{
"status":"1",
"info":"OK",
"infocode":"10000",
"province":"浙江省",
"city":"杭州市",
"adcode":"330100",
"rectangle":"119.8824799,29.95931271;120.5552208,30.52048536"
}
此传入的ip为公网ip,所以我们还需要获取到请求者的公网ip:
package com.test.utils; import javax.servlet.http.HttpServletRequest; /**
* 请求对象 工具类
*/
public class RequestUtils {
/**
* 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;
*
* @param request
* @return
* @throws
*/
public final static String getIpAddress(HttpServletRequest request) {
// 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
String ip = request.getHeader("X-Forwarded-For"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
} else if (ip.length() > 15) {
String[] ips = ip.split(",");
for (String ip1 : ips) {
String strIp = (String) ip1;
if (!("unknown".equalsIgnoreCase(strIp))) {
ip = strIp;
break;
}
}
}
return ip;
}
}
实际使用示例如下:
package com.test.web.common; import com.alibaba.fastjson.JSONObject;
import com.test.utils.RequestUtils;
import com.test.utils.gaode.GdUtil;
import org.apache.log4j.Logger; import javax.servlet.http.HttpServletRequest; /**
*/
@RestController
@RequestMapping(value = "/api/core")
public class TestController {
private Logger log = Logger.getLogger(this.getClass());
@RequestMapping(value = "/test", method = RequestMethod.POST)
public JsonResp test(@RequestBody JSONObject reqJson, HttpServletRequest request) {
log.debug("测试获取访问者的城市编码")
JSONObject resJson = new JSONObject(); String ip = RequestUtils.getIpAddress(request);
String adCode = GdUtil.getCityCodeByIp(ip);
resJson.put("cityCode", adCode); return JsonResp.ok(resJson);
}
}
通过以上方法便可以成功的获取到访问者的城市编码等信息了
高德地图获取key:可参考高德教程:https://lbs.amap.com/api/webservice/guide/create-project/get-key
1. 进入我的应用中
2. 若没有应用则创建新应用
3. 点击+号添加key
4. 填写信息,选择web服务
5. 保存提交
6. 在应用列表下的key列表中出现新添加的key
请求参数和响应参数说明(infocode状态码可参考:https://lbs.amap.com/api/webservice/guide/tools/info)
java调用高德地图api实现通过ip定位访问者的城市的更多相关文章
- js调用高德地图API获取地理信息进行定位
<script type="text/javascript" src="http://webapi.amap.com/maps?v=1.3&key=(需要自 ...
- java调用百度地图API依据地理位置中文获取经纬度
百度地图api提供了非常多地图相关的免费接口,有利于地理位置相关的开发,百度地图api首页:http://developer.baidu.com/map/. 博主使用过依据地理依据地理位置中文获取经纬 ...
- Geocoding java调用百度地图API v2.0 图文 实例( 解决102错误)
如何使用? 第一步:申请ak(即获取密钥),若无百度账号则首先需要注册百度账号. 第二步,拼写发送http请求的url,注意需使用第一步申请的ak. 第三步,接收http请求返回的数据(支持json和 ...
- Android——调用高德地图API前期准备
1.登陆高德开放平台注册账号http://lbs.amap.com/ 2.创建自己的应用并且添加新key 获取发布版安全码获取方法: 在AndroidStudio的Terminal中编译: 输入如下图 ...
- java调用百度地图API
http://blog.csdn.net/iTommy2016/article/details/75144936 http://blog.csdn.net/kingken212/article/det ...
- 调用高德地图API(热力图)详解
具体脚本语言如下: <!doctype html> <html> <head> <meta charset="utf-8"> < ...
- android 高德地图API 之 java.lang.UnsatisfiedLinkError: Couldn't load amapv3: findLibrary returned null错误
错误场景: 运行android app时,在运行到调用高德地图API时,出现 “java.lang.UnsatisfiedLinkError: Couldn't load amapv3: findLi ...
- JS框架_(JQuery.js)高德地图api
百度云盘 传送门 密码 :ko30 高德地图api效果 <!doctype html> <html> <head> <meta charset="u ...
- 【高德地图API】从零开始学高德JS API(七)——定位方式大揭秘
原文:[高德地图API]从零开始学高德JS API(七)——定位方式大揭秘 摘要:关于定位,分为GPS定位和网络定位2种.GPS定位,精度较高,可达到10米,但室内不可用,且超级费电.网络定位,分为w ...
随机推荐
- 打开控制台F12弹出弹窗
window.onload=function(){ document.onkeydown=function(){ var e=w ...
- Django缓存设置
由于Django构建得是动态网站,每次客户端请求都要严重依赖数据库,当程序访问量大时,耗时必然会更加明显,最简单解决方式是使用:缓存,缓存将一个某个views的返回值保存至内存或者memcache中, ...
- 算法练习LeetCode初级算法之排序和搜索
合并两个有序数组 class Solution { public void merge(int[] nums1, int m, int[] nums2, int n) { System.arrayco ...
- 飞鱼星、H3C企业路由器配置
飞鱼星企业路由器配置外网访问IIS 只配置端口映射就行,配置好了,如果不立即重启,需要等几分钟才能生效 H3C路由器配置虚拟服务器即可
- JavaSE基础知识(4)—数组的应用
一.数组的特点.好处及使用步骤 1.数组的好处 特点:相当于用于保存一组元素的容器好处: 1.提高代码的简洁性和扩展性,且同时开辟多个空间,提高了效率 2.分类存储,且空间是连续的,容易查找 2.数组 ...
- Linux系统中的tar命令
时间一长什么东西都容易忘记,尤其是一些不常用的东西忘记的更快,所以避免忘记,就记录下来,可以方面使用的时候查询.Tar命令在linux系统中算是一个比较重要的命令,今天就针对该命令进行总结一下. 1. ...
- elk kibana查询语法
elk日志系统中kibana查询语法 单项term查询 例: 搜 Dahlen, Malone 字段field查询 field:value 例:city:Keyport, age:26 通配符 ? 匹 ...
- 关于requests库中文编码问题
转自:代码分析Python requests库中文编码问题 Python reqeusts在作为代理爬虫节点抓取不同字符集网站时遇到的一些问题总结. 简单说就是中文乱码的问题. 如果单纯的抓取微博 ...
- 对于PHP面试知识点的小结
基础篇 了解大部分数组处理函数 字符串处理函数(区别 mb_ 系列函数) & 引用,结合案例分析 == 与 === 区别 isset 与 empty 区别 全部魔术函数理解 static.$t ...
- win7 home 提升 admin, pip
以管理员权限运行cmd cmd 右击‘以管理员身份运行’ 输入net user administrator /active:yes 取消为 net user administrator /acti ...