java 使用post获取ip归属地及运营商(附源代码)
有段时间没写博文了,抱歉了各位读者,一直以来遵循实用性,为例子而做的例子难免有些枯燥,没有实用性,还是带着目的去做吧。刚刚学车回来,赶着写这篇文章。网页传输数据最常用的是方法是get和post,java的get方法很简单,get通常是用来获取数据的,当然,如果有需要,get也可以用来发送数据。最近一直在学车,除了练车外,其他的时间都用来看驾驶视频,在一些java群里看到有人在问怎么用java来做post?本文将一步步实现用post来获取ip归属地。实现的功能是:只需要提供一个ip地址,就能返回该Ip的城市名称及线路,很实用哦。
网上根据ip查所在城市的接口很多,随便找一个吧,今天用的是: https://tool.lu/ip,打开后看到有输入框可以输入ip地址,输入:123.125.71.100,点击查询,观察网址,没有任何变化,说明这个接口就是post查询接口,完全符合例子的要求,好,就选它了。

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

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)
到此,这个例子就完成了,有不明白的地方,可以留言哦。
更多阅读

qq:1535604235


QQ
微信
商店