java 使用post获取ip归属地及运营商(附源代码)

作者: 杨圣亮 分类: Java编程 发布时间: 2019-02-23 15:48:20

有段时间没写博文了,抱歉了各位读者,一直以来遵循实用性,为例子而做的例子难免有些枯燥,没有实用性,还是带着目的去做吧。刚刚学车回来,赶着写这篇文章。网页传输数据最常用的是方法是get和post,java的get方法很简单,get通常是用来获取数据的,当然,如果有需要,get也可以用来发送数据。最近一直在学车,除了练车外,其他的时间都用来看驾驶视频,在一些java群里看到有人在问怎么用java来做post?本文将一步步实现用post来获取ip归属地。实现的功能是:只需要提供一个ip地址,就能返回该Ip的城市名称及线路,很实用哦。

网上根据ip查所在城市的接口很多,随便找一个吧,今天用的是: https://tool.lu/ip,打开后看到有输入框可以输入ip地址,输入:123.125.71.100,点击查询,观察网址,没有任何变化,说明这个接口就是post查询接口,完全符合例子的要求,好,就选它了。

lu-ip.png

看到这里,是不是觉得无从下手呢?别急,分析源代码,发现如下代码:

1550906482398183.png

form action后的网址就是ip查询接口了,得到了接口地址,若想完成post请求,还需要获取输入框的name里的值,得到:ip,得到这两样东西,跟着就可以开干了。该接口返回的数据是一个json字符串,包含有ip地址,归属地等信息。json数据的解析java自带的方法并不能做到,用到阿里巴巴的开源项目:fastjson,地址是:github.com/alibaba/fastjson,下载最新的jar包,下载方法就不多说了,很简单,下载包后并添加到java项目的Libraries路径里。接着就可以编写代码了,完整代码如下:

/**
 * @date 2019-02-23
 * @url yangshengliang.com
 * @author 杨圣亮
 */

import com.alibaba.fastjson.JSONObject;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;
import java.net.URL;

/**
 * tool 按ip查询归属地
 */

public class PostDemo {

    private final static String IPURL = "https://tool.lu/ip/ajax.html";

    public static void main(String[] args) {
        try {
            String ip = "123.125.71.100";
           System.out.println( PostDemo.getDateByIp(ip));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static String getDateByIp(String ip) throws IOException {
        HttpURLConnection httpURLConnection = null;
        BufferedReader reader = null;
        StringBuilder builder = new StringBuilder();
        String ipLocation = null;
        int responseCode = 0;
        try {
            //构建post请求
            URL url = new URL(IPURL);
            httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            httpURLConnection.setConnectTimeout(5000);
            httpURLConnection.setReadTimeout(5000);
            PrintWriter writer = new PrintWriter(httpURLConnection.getOutputStream());
            //发送数据
            writer.write("ip=" + ip);
            //刷新
            writer.flush();
            //关闭
            writer.close();
            //获取响应码,为200时,才是成功的。
            responseCode = httpURLConnection.getResponseCode();
            if (responseCode == 200) {
                reader = new BufferedReader(new InputStreamReader(httpURLConnection.getInputStream()));
                String line;
                while ((line = reader.readLine()) != null) {
                    builder.append(line);
                }
                String json = builder.toString();
                /**
                * 得到json数据为:{"status":true,"message":"","text":{"ip":"123.125.71.100","l":2071807844,"location":"\u5317\u4eac\u5e02 \u5317\u4eac\u767e\u5ea6\u7f51\u8baf\u79d1\u6280\u6709\u9650\u516c\u53f8\u8054\u901a\u8282\u70b9(BGP)","tb_location":"   ","ipip_location":"\u4e2d\u56fd \u5317\u4eac \u5317\u4eac -","ip2region_location":"\u4e2d\u56fd \u5317\u4eac \u5317\u4eac\u5e02 \u8054\u901a"}}
                * 分析json结构,其中的location的结果就是归属地信息
                */
                if (json.length() > 0) {
                    JSONObject jsonObject = JSONObject.parseObject(json);
                    if (jsonObject != null) {
                        JSONObject textJson = JSONObject.parseObject(jsonObject.getString("text"));
                        if (textJson != null) {
                            ipLocation = textJson.getString("location");
                        }
                    }
                }
            } else if (responseCode == 500) {
                System.out.println("500错误");
            }
        } catch (SocketTimeoutException so) {
            System.out.println("网速不理想,连接超时");
            
        } catch (MalformedURLException e) {
            e.printStackTrace();

        } catch (IOException e) {
            e.printStackTrace();
            
        } finally {
            if (httpURLConnection != null) {
                httpURLConnection.disconnect();
            }
            if (reader != null) {
                reader.close();
            }
        }
        //返回ip归属地和运营商信息
        return ipLocation;
    }
}

最终得到结果:

北京市 北京百度网讯科技有限公司联通节点(BGP)

到此,这个例子就完成了,有不明白的地方,可以留言哦。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

3  +  7  =  

微信