首先:我需要做一个玩家省份统计的需求,我只有他们的IP 如果然我一个个去百度搜IP,然后一个个输入,简直太要命,所以,我做了一个用Java 代替人力 用IP去换物理地址

地址:https://ip.taobao.com/ipSearch

思路:我在访问淘宝IP地址库的时候发现了 每次搜索 都会发送一个Http协议的Post的请求,并发现了 这是一个Json响应的结果。

我就想:利用Java代码 模拟Restful风格的接口 不也能做到同样的效果么,当然,这里的模拟是指 模拟 人 手动发送请求。

首先,要找到Http的请求工具,我想了一下Hutool库中有此工具,Maven如下

        <!-- Hutool工具 -->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.5.6</version> <!-- 版本会更新 想用最新的版本在:https://www.hutool.cn/docs/#/ -->
        </dependency>

然后发送了请求,我得需要处理 Json 吧,那就使用传说中的 AlibabaFastJson 吧,当然也可以用我的Jsop来处理。

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.74</version>
        </dependency>

既然 得了此 两员(FastJson、Hutool的HttpUtil)大将,那就开始盘它。

这里,再次强调一下思路

利用Hutool的HttpUtil,发送Post请求,得到一个String(就是请求结果), 用这个String经过第一次FastJson处理后封装到Map集合。

(获取的集合内容是我们浏览器看到的Json)

我们需要的数据在data里面,所以,要拿出来data数据,作为String,在经过FastJson处理一下,得到的Map集合,都到了我们Java范围内,我们就可以随便控制输出了。

代码如下

import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import java.util.HashMap;
import java.util.Map;

public class PostTaobaoGetPos {

    public static void main(String[] args) {
        HashMap<String, Object> paramMap = new HashMap<>();
        // 填写自己的想要查询的IP
        paramMap.put("ip", "49.85.228.158");
        paramMap.put("accessKey", "alibaba-inc");
        String result1 = HttpUtil.post("http://ip.taobao.com/outGetIpInfo", paramMap);
        // 处理数据
        Map jsonmap = (Map)JSON.parse(result1);
        Map<String,String> datamap = (Map)JSON.parse(jsonmap.get("data").toString());
        // 输出
        System.out.println("判断下请求是否拿到数据了 (如果是0,那么完蛋,啥也没拿到):"+datamap.size());
        System.out.println();
        System.out.println("ip is:"+datamap.get("queryIp"));
        System.out.println("国家 is:"+datamap.get("country"));
        System.out.println("省份 is:"+datamap.get("region"));
        System.out.println("市 is:"+datamap.get("city"));
        System.out.println("运营商 is:"+datamap.get("isp"));

    }
}

完结!