非会员用户可以在聚合的官网免费申请10个api接口(聚合数据-API-API接口-API数据服务)
特别提醒需要实名认证才允许申请 许多免费接口对企业开放不对个人开放
在使用层面,无论使用什么网络框架,对于缓存,请求超时配置,请求体数据体的配置,https证书信任,等层面的东西,在工具框架库的层面,大同小异,只是封装的模式,提供的功能差异,不够根本的差距。
在JDK的java.net包中已经提供了访问HTTP协议的基本功能的类:HttpURLConnection。HttpURLConnection是Java的标准类,继承自URLConnection,可用于向指定网站发送GET请求、Post请求。
public String doGet(String httpUrl,String queryParams){
HttpURLConnection connection =null;
InputStream inputStream=null;
BufferedReader bufferedReader=null;
String result=null; //返回结果字符串
try{
//创建原创url链接对象
URL url = new URL(new StringBuffer(httpUrl).append("?").append(queryParams).toString());
//通过远程url链接对象打开一个链接,强转成httpURLConnection类
connection =(HttpURLConnection) url.openConnection();
//设置连接方式:get
connection.setRequestMethod("GET");
//设置连接主机服务器的超时视角:15000毫秒
connection.setConnectTimeout(5000);
//设置读取远程返回的数据时间:60000毫秒
connection.setReadTimeout(6000);
//发送请求
connection.connect();
//通过connection连接,获取数据流
if (connection.getResponseCode()==200){
inputStream=connection.getInputStream();
//封装输入流,并指定字符集
bufferedReader=new BufferedReader(new InputStreamReader(inputStream,StandardCharsets.UTF_8));
//存放数据
StringBuilder sbf=new StringBuilder();
String temp;
while ((temp = bufferedReader.readLine()) != null){
sbf.append(temp);
sbf.append(System.getProperty("line.separator"));
}
result=sbf.toString();
}
}catch (IOException e){
e.printStackTrace();
}finally {
//关闭资源
if (null!=bufferedReader){
try {
bufferedReader.close();
}catch (IOException e){
e.printStackTrace();
}
}
if (null != inputStream){
try {
inputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
if (connection!=null){
connection.disconnect();//关闭远程连接
}
}
return result;
}
特别指出的是JDK8自带的HttpURLConnection,默认启用keepAlive,支持HTTP / 1.1和HTTP / 1.0持久连接。底层的socket在keepAlive超时之前都不会关闭。当我们调用connection.disconnect后,关闭了inputStream,并不会断开socket,当需要连接到同一服务器的时候,就可以复用Socket
对于需要传入的url,选择使用Map的方式进行存储。在get请求中,一般把请求参数放在"?"之后,每个参数用"&"进行链接。在程序中选择手写一个urlencode方法进行url的拼接
public String urlencode(Map<String,?> data){
StringBuilder sb=new StringBuilder();
for (Map.Entry<String,?>i:data.entrySet()){
try{
sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue()+"","UTF-8")).append("&");
}catch (UnsupportedEncodingException e){
e.printStackTrace();
}
}
String result=sb.toString();
result = result.substring(0,result.lastIndexOf("&"));
return result;
}
这样一个基本的get请求的工具类就编写完毕了。
对于Service的编写,获得请求到的数据,并且转化为json格式的数据,方便读取。
public String IpSearch(String IP){
String url="";//请求的url
String key=""; //请求的key
String res="";//请求的结果
Map<String,String> params=new HashMap<>();//传入的参数
params.put("ip",IP);
params.put("key",key);
RequestTool requestTool=new RequestTool();
String queryParam=requestTool.urlencode(params);//拼接
String response=requestTool.doGet(url,queryParam);//获取返回结果
try{
JSONObject jsonObject= JSONObject.fromObject(response);//转化成JSON代码
int errCode= jsonObject.getInt("error_code");//取出错误代码
if (errCode==0){//请求成功
JSONObject result=jsonObject.getJSONObject("result");//将JSON中的result对象取出
res ="查到"+"当前ip地址的归属地是:"+"\n"+result.getString("Country")
+result.getString("Province")+"省"+result.getString("City")+"市"
+result.getString("District")+"\n"+"运营商是"+result.getString("Isp");
}
}catch (Exception e){
e.printStackTrace();
res=errMsg;
}
return res;
}
再在controller一层中进行简单的封装,一个最基本的ip地址查询接口就开发完毕了