Java获取ip地址

目录

1.介绍

2.ip归属地查询接口

淘宝API接口

太平洋IP地址查询

四川涪擎大数据技术有限公司

深圳华辰接口

请求示例

上代码片段

getIp()


1.介绍

需求:获取app端ip地址,并调用接口查询ip归属地。

bug:ip地址获取不一致。

 

2.ip归属地查询接口

淘宝API接口

http://ip.taobao.com/service/getIpInfo.php?ip=[ip地址字串]

测试过了没用,一直返回

{"msg":"the request over max qps for user ,the accessKey=public","code":4}

太平洋IP地址查询

http://whois.pconline.com.cn/ipJson.jsp?ip=xxx.xxx.xxx.xxx&json=true

可用,不过项目中总会返回乱码问题

 

后台跟老大咨询,他说之前买了x度推广的接口,结果申请发票一直没发过来,em....考虑了一下报销问题,还是选择用了阿里云市场的API,接口挺多的,任君选择,https://market.aliyun.com/products/?keywords=ip%E5%BD%92%E5%B1%9E%E5%9C%B0

 

四川涪擎大数据技术有限公司

http(s)://hcapi20.market.alicloudapi.com/ip

 

深圳华辰接口

http(s)://api01.aliyun.venuscn.com/ip

 

请求示例

public static void main(String[] args) {
	   String host = "https://ips.market.alicloudapi.com";
	    String path = "/iplocaltion";
	    String method = "GET";
        //阿里云界面查看
	    String appcode = "你自己的AppCode";
	    Map headers = new HashMap();
	    //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
	    headers.put("Authorization", "APPCODE " + appcode);
	    Map querys = new HashMap();
	    querys.put("ip", "127.0.0.1");

            //JDK 1.8示例代码请在这里下载:  http://code.fegine.com/Tools.zip

	    try {
	    	/**
	    	* 重要提示如下:
	    	* HttpUtils请从
	    	* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java
	    	* 下载
	    	*
	    	* 相应的依赖请参照
	    	* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
	    	*/
	    	HttpResponse response = HttpUtils.doGet(host, path, method, headers, querys);
//System.out.println(response.toString());如不输出json, 请打开这行代码,打印调试头部状态码。
                //状态码: 200 正常;400 URL无效;401 appCode错误; 403 次数用完; 500 API网管错误
	    	//获取response的body
	    	System.out.println(EntityUtils.toString(response.getEntity()));
	    } catch (Exception e) {
	    	e.printStackTrace();
	    }
	}

 

上代码片段

接口请求,原本是直接调用request.getRemoteAddr();后发现ip获取不对劲,改用getIp()方法。

//调用ip访问接口
//         String ip = request.getRemoteAddr();
            String ip = getIp(request);
            if(StringUtil.isNotEmpty(ip)){
            	po.setIp(ip);
            	logger.info("===3.获取到的手机ip====="+request.getHeader(""));
            }
            
            String host = "https://api01.aliyun.venuscn.com";
			String path = "/ip";
			String method = "GET";
			String appcode = "xxxxxxxx";
			Map headers = new HashMap();
			headers.put("Authorization", "APPCODE " + appcode);
			Map querys = new HashMap();
			querys.put("ip", ip);
			HttpResponse response = HttpUtils.doGet(host, path, method, headers, querys);
            String ipString = EntityUtils.toString(response.getEntity());
            JSONObject jsonString = JSONObject.fromObject(ipString);
            if("200".equals(jsonString.getString("ret"))){
            	JSONObject jsonObject = jsonString.getJSONObject("data");
            	String countryName = jsonObject.getString("country");
            	String regionName = jsonObject.getString("region");
            	String cityName = jsonObject.getString("city");
            	po.setIpAddress(regionName+"省"+cityName+"市");
            	logger.info("获取到的ip地址"+po.getIpAddress());
            }

getIp()

当经过代理服务器或者有多个ip地址时,取最开始的ip地址。

 public static String getIp(RequestWrapper request) {
        String ip = request.getHeader("X-Forwarded-For");
        if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
        	logger.info("=====1.查看是否多个ip地址======="+ip);
            //多次反向代理后会有多个ip值,第一个ip才是真实ip
            int index = ip.indexOf(",");
            if(index != -1){
                return ip.substring(0,index);
            }else{
                return ip;
            }
        }
        ip = request.getHeader("X-Real-IP");
        if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){
        	logger.info("=====2.查看是否多个ip地址======="+ip);
            return ip;
        }
        return request.getRemoteAddr();
    }

 

你可能感兴趣的:(初级Java成长专栏)