早上一来,项目经理就说需要添加一个用户ip归属地查询功能,然后在网上搜罗半天,研究出一个比较简单的方法,通过接口返回地址json数据
有百度接口,新浪接口,这里用的是淘宝ip接口
通过淘宝IP地址库获取IP位置
请求接口(GET):http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串]
响应信息:(json格式的)国家 、省(自治区或直辖市)、市(县)、运营商等
2018.2.26运行项目发现淘宝接口报错502,于是找到一个替代的接口,新浪接口
String sip = “http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js”;
直接将淘宝接口 换成这个就可以运行,过程一样
public static void main(String[] args) { // 测试ip 221.232.245.73 湖北武汉 String ip = "221.232.245.73"; String address = ""; try { address = addressUtils.getAddresses("ip="+ip, "utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(address); // 输出结果为:中国 湖北省 武汉市 } /** 3 * @param content 4 * 请求的参数 格式为:name=xxx&pwd=xxx 5 * @param encoding 6 * 服务器端请求编码。如GBK,UTF-8等 7 * @return 8 * @throws UnsupportedEncodingException 9 */ 10 public String getAddresses(String content, String encodingString) throws UnsupportedEncodingException { 11 // 这里调用pconline的接口 12 String urlStr = "http://ip.taobao.com/service/getIpInfo.php"; 13 // 从http://whois.pconline.com.cn取得IP所在的省市区信息 14 String returnStr = this.getResult(urlStr, content, encodingString); 15 if (returnStr != null) { 16 // 处理返回的省市区信息 17 System.out.println("IP====="+returnStr); 18 String[] temp = returnStr.split(","); 19 if(temp.length<3){ 20 return "0"; //无效IP,局域网测试 21 } 22 String region = (temp[5].split(":"))[1].replaceAll("\"", ""); 23 region = decodeUnicode(region); // 省 24 System.out.println("region = "+region); 25 26 String country = ""; 27 String area = ""; 28 // String region = ""; 29 String city = ""; 30 String county = ""; 31 String isp = ""; 32 System.out.println("temp的长度="+temp.length); 33 for (int i = 0; i < temp.length; i++) { 34 switch (i) { 如果使用的是新浪的接口,那这里的需要修改,case:3 4 5分别对应国家,省,市区 35 case 1: 36 country = (temp[i].split(":"))[2].replaceAll("\"", ""); 37 country = decodeUnicode(country); // 国家 38 break; 39 case 3: 40 area = (temp[i].split(":"))[1].replaceAll("\"", ""); 41 area = decodeUnicode(area); // 地区 42 break; 43 case 5: 44 region = (temp[i].split(":"))[1].replaceAll("\"", ""); 45 region = decodeUnicode(region); // 省份 46 break; 47 case 7: 48 city = (temp[i].split(":"))[1].replaceAll("\"", ""); 49 city = decodeUnicode(city); // 市区 50 break; 51 case 9: 52 county = (temp[i].split(":"))[1].replaceAll("\"", ""); 53 county = decodeUnicode(county); // 地区 54 break; 55 case 11: 56 isp = (temp[i].split(":"))[1].replaceAll("\"", ""); 57 isp = decodeUnicode(isp); // ISP公司 58 break; 59 } 60 } 61 System.out.println(country+"="+area+"="+region+"="+city+"="+county+"="+isp); 62 return region; 63 } 64 return null; 65 } 66 67 68 69 /** 70 * @param urlStr 71 * 请求的地址 72 * @param content 73 * 请求的参数 格式为:name=xxx&pwd=xxx 74 * @param encoding 75 * 服务器端请求编码。如GBK,UTF-8等 76 * @return 77 */ 78 private String getResult(String urlStr, String content, String encoding) { 79 URL url = null; 80 HttpURLConnection connection = null; 81 try { 82 url = new URL(urlStr); 83 connection = (HttpURLConnection) url.openConnection(); // 新建连接实例 84 connection.setConnectTimeout(2000); // 设置连接超时时间,单位毫秒 85 connection.setReadTimeout(2000); // 设置读取数据超时时间,单位毫秒 86 connection.setDoOutput(true); // 是否打开输出流 true|false 87 connection.setDoInput(true); // 是否打开输入流true|false 88 connection.setRequestMethod("POST"); // 提交方法POST|GET 89 connection.setUseCaches(false); // 是否缓存true|false 90 connection.connect(); // 打开连接端口 91 DataOutputStream out = new DataOutputStream(connection.getOutputStream());// 打开输出流往对端服务器写数据 92 out.writeBytes(content); // 写数据,也就是提交你的表单 name=xxx&pwd=xxx 93 out.flush(); // 刷新 94 out.close(); // 关闭输出流 95 BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream(), encoding));// 往对端写完数据对端服务器返回数据 ,以BufferedReader流来读取 96 StringBuffer buffer = new StringBuffer(); 97 String line = ""; 98 while ((line = reader.readLine()) != null) { 99 buffer.append(line);100 }101 reader.close();102 return buffer.toString();103 } catch (IOException e) {104 e.printStackTrace();105 } finally {106 if (connection != null) {107 connection.disconnect(); // 关闭连接108 }109 }110 return null;111 }112 113 /**114 * unicode 转换成 中文115 *116 * @author fanhui 2007-3-15117 * @param theString118 * @return119 */120 public static String decodeUnicode(String theString) {121 char aChar;122 int len = theString.length();123 StringBuffer outBuffer = new StringBuffer(len);124 for (int x = 0; x < len;) {125 aChar = theString.charAt(x++);126 if (aChar == '\\') {127 aChar = theString.charAt(x++);128 if (aChar == 'u') {129 int value = 0;130 for (int i = 0; i < 4; i++) {131 aChar = theString.charAt(x++);132 switch (aChar) {133 case '0':134 case '1':135 case '2':136 case '3':137 case '4':138 case '5':139 case '6':140 case '7':141 case '8':142 case '9':143 value = (value << 4) + aChar - '0';144 break;145 case 'a':146 case 'b':147 case 'c':148 case 'd':149 case 'e':150 case 'f':151 value = (value << 4) + 10 + aChar - 'a';152 break;153 case 'A':154 case 'B':155 case 'C':156 case 'D':157 case 'E':158 case 'F':159 value = (value << 4) + 10 + aChar - 'A';160 break;161 default:162 throw new IllegalArgumentException(163 "Malformed encoding.");164 }165 }166 outBuffer.append((char) value);167 } else {168 if (aChar == 't') {169 aChar = '\t';170 } else if (aChar == 'r') {171 aChar = '\r';172 } else if (aChar == 'n') {173 aChar = '\n';174 } else if (aChar == 'f') {175 aChar = '\f';176 }177 outBuffer.append(aChar);178 }179 } else {180 outBuffer.append(aChar);181 }182 }183 return outBuffer.toString();184 }
输出结果为
IP====={"code":0, "data":{ "ip":"221.232.245.73", //ip "country":"中国", //国家 "area":"", //区 "region":"湖北", //省 "city":"武汉", //市 "county":"XX", "isp":"电信", //宽带运营 "country_id":"CN", //国家id "area_id":"", //区编码 "region_id":"420000", //省编码 "city_id":"420100", //市编码 "county_id":"xx", "isp_id":"100017"}}region = 武汉temp的长度=14中国==武汉=电信==420100
要铭记在心;每天都是一年中最美好的日子