第三方(聚合)的api接口调用

非会员用户可以在聚合的官网免费申请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地址查询接口就开发完毕了

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值