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