--------------------如何把ip地址转换成地域信息?----------------------

//a:调用taobao ip地址库提供的接口
//http://ip.taobao.com提供的对外服务接口
//http://ip.taobao.com/service/getIpInfo.php?ip=219.231.255.255
//b:把taobao ip服务返回的json字符串 封装成结果bean

 

代码如下

1
2

package com.bw.transformers.etl.utils;
/**
* 转换ip地址工具类
* @author admin
*
*/

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import org.apache.htrace.fasterxml.jackson.databind.ObjectMapper;

import com.bw.transformers.common.SystemConstant;
import com.bw.transformers.etl.bean.JsonBean;
import com.bw.transformers.etl.bean.RegionBean;

public class IPUtil {

/**
* 通过ip地址获取其对应的地域信息
* @param ip
* @return
*/
public static RegionBean changeIPToRegionInfo(String ip) {
//1:通过taobao ip 服务获取地域信息
RegionBean regionBean = getRegionInfoByTaobaoService(ip);
//2: 校验RegionBean数据合法性
validRegionInfo(regionBean);
return regionBean;

}

//校验获取到的地域信息
/*
* 处理哪些不合法信息:
* a:任何一个地域信息如果查不到
* 不能是xx 需要提示信息"未知"
* b:每次省或者市查询之后都需要补充 "省" 或者 "市"
* c:省需要单独处理
* c1:处理自治区
* 内蒙古
* 新疆
* 宁夏
* 广西
* 西藏
* c2:处理直辖市
* 北京
* 天津
* 上海
* 重庆
* c3:特别行政区
* 香港
* 澳门
* c4:省
* 其它
*/
private static void validRegionInfo(RegionBean regionBean) {
//1:处理国家
String country = regionBean.getCountry();
if (country==null||"xx".equalsIgnoreCase(country)) {
regionBean.setCountry("未知");
} else {
regionBean.setCountry("中国");
}

//2:处理市
String city = regionBean.getCity();
if (city==null||"xx".equalsIgnoreCase(city)) {
regionBean.setCity("未知");
} else {
regionBean.setCity(city+"市");
}

//3:处理省
String province = regionBean.getRegion();
if (province==null||"xx".equalsIgnoreCase(province)) {
regionBean.setRegion("未知");
} else {
if ("内蒙古".equals(province)||"新疆".equals(province)||"宁夏".equals(province)
||"广西".equals(province)||"西藏".equals(province)) {
regionBean.setRegion(province+"自治区");
}else if ("北京".equals(province)||"天津".equals(province)||"上海".equals(province)
||"重庆".equals(province)) {
regionBean.setRegion(province+"市");
}else if ("香港".equals(province)||"澳门".equals(province)) {
regionBean.setRegion(province+"特别行政区");
}else {
regionBean.setRegion(province+"省");
}
}
}


private static RegionBean getRegionInfoByTaobaoService(String ip) {
RegionBean rBean = null;
//a:拼接访问taobao ip服务的字符串
//http://ip.taobao.com/service/getIpInfo.php?ip=219.231.255.255
String sendurl = SystemConstant.IP_TAOBAO_URL_PREFIX+"?ip="+ip;
//b:发送url 调用服务
URL url = null;
HttpURLConnection connection = null;
JsonBean jsonBean = null;
try {
url = new URL(sendurl);//通过url创建网络对象
connection = (HttpURLConnection) url.openConnection();//通过网络对象获取网络连接
connection.setRequestMethod("GET");//指明请求的方式是get方式
connection.setReadTimeout(2*1000);//设定读取返回数据流的超市时间
//以上是通过http开始调用taobao ip服务

// * io:
// * a:此时是接收taobao ip服务的返回值 就是response
// * 对于当前的代码客户端就是输入流
// * 对于网络就是最基本的输入字节流
InputStream is = connection.getInputStream();//从服务连接返回response 客户端输入网络流
//b:把输入流转成字符流 因为如果请求 响应正确 最终是接受json字符串
//所以这个字节流肯定可以转成字符流
Reader reader = new InputStreamReader(is, "UTF-8");
//c:给输入字符流再加缓冲 提升效率
BufferedReader bufferedReader = new BufferedReader(reader);
//d:开始接收返回的json字符串
String json = "";
String line = null;
while ((line=bufferedReader.readLine())!=null) {
json += line;
}
//通过以上的循环 json字符串就是taobao ip服务最终返回的所有json

//把接收到的json字符串 封装入bean
//常用的json字符串和bean或者集合互相转化使用的中间件:
//a:fastjson
//b:jackson 默认的springmvc底层相互转化使用的中间件
ObjectMapper objectMapper = new ObjectMapper();
jsonBean = objectMapper.readValue(json, JsonBean.class);

} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jsonBean.getData();
}
}

posted @ 2019-06-11 10:26  wuyingying  阅读(774)  评论(0)    收藏  举报