项目需要根据ip查询pos机设备所在的省份信息,经查询有以下几种免费接口:
1. 淘宝IP API http://ip.taobao.com/service/getIpInfo.php?ip=xxx
2. 新浪IP API http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=xxx
3. 126IP API http://ip.ws.126.net/ipquery?ip=xxx
三种方法经过测试对比后,最终选择了新浪IP API
API | API格式 | 结果 | 优点 | 缺点 |
淘宝IP API | http://ip.taobao.com/service/getIpInfo.php?ip=219.136.49.117 | 根据ip可以查询到的地理信息有:国家、省、市、县、运营商,信息维度广,格式规范,精确度高,数据质量有保障。 | 同一个ip连续查第二次时,等待时间相对比较长,一段时间内浏览器会返回request is not finished yet.可能是内部对同一用户对某一个ip访问次数存在限制。 | |
新浪IP API | http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=219.136.49.117 | 响应迅速,返回结果快,并且返回的数据类型可以自定义格式,默认为纯文本格式,根据format的参数定制,可以返回JS、Json格式,数据准确。 | 结果描述没带单位,比如province返回的是广东而不是广东省,返回的信息没有淘宝的全面。 | |
126IP API | 响应迅速,返回结果快。 | 返回结果信息少,数据相对不是很准确,比如香港的ip(219.78.113.243)结果地址会返回广东。 |
引用的包:
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL;
代码如下:
/** * 根据ip返回省市信息 * * @param ip 设备所在ip地址 * @return */ public static String getProvinceByIp(String ip) { String path = "http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=" + ip; String inputInfo = ""; String info = ""; try { URL url = new URL(path); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setReadTimeout(10 * 1000); connection.setRequestMethod("GET"); InputStreamReader inputStreamReader = new InputStreamReader(connection.getInputStream(), "UTF-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); while ((inputInfo = bufferedReader.readLine()) != null) { info += inputInfo; } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } JSONObject jsonObject = JSONObject.parseObject(info); String province = jsonObject.get("province").toString(); switch (province) { case "香港": case "澳门": province += province + "特别行政区"; break; case "北京": case "上海": case "天津": case "重庆": province += "市"; break; case "内蒙古": case "西藏": province += "自治区"; break; case "新疆": province += "维吾尔自治区"; break; case "宁夏": province += "回族自治区"; break; case "广西": province += "壮族自治区"; break; default: province += "省"; break; } return province; }