Java中使用HTTP阻塞式调用服务器API

Posted 玉不琢,不成器;人不学,不知道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中使用HTTP阻塞式调用服务器API相关的知识,希望对你有一定的参考价值。

应用场景:前端页面点击刷新,调用服务器A上Java接口,然后A调用服务器B的后台Python接口实时刷新后台数据库。

 

在这个场景中会涉及到两个问题:异步,Python服务器压力

 

(一)解决Python服务器压力

如果Python服务器接口不做任何措施,那么可能会有恶意的访问,从而导致该服务器一直刷新后台数据库。

我的解决方式是:服务器B会提供一串字符串给服务器A,当服务器A调用服务器B的服务时,将传递的参数和该字符串拼接再进行MD5加密,从而在服务器B上通过这个token值明确对方身份。

 

(二)异步

异步问题是:如何解决服务器A上的Java接口等待Python程序刷新数据库后返回的success,从而使得前端页面阻塞更新。

主要是通过Java中HttpURLConnection.InputStreamReader的方法实现异步:

    public String requestRefresh(String token, String clusterName){
        String result = null;
        try{
            // 打开和URL之间的连接
            URL url = new URL(URL_Refresh_Couchbase_Cluster);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoOutput(true);
            connection.setDoInput(true);
            connection.setUseCaches(false);
            connection.setRequestMethod("GET");
            connection.setRequestProperty("content-type", "application/x-www-form-urlencoded");
            OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(),"UTF-8");
            // 把数据写入请求的Body
            out.write("token=" + token + "&cluster=" + clusterName); //参数形式跟在地址栏的一样
            out.flush();
            out.close();
            // 获取数据,将返回的输入流转换成字符串
            InputStream inputStream = connection.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            result = bufferedReader.readLine();
            // 释放资源
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            connection.disconnect();
        }catch (Exception e){
            log.info("(requestRefresh) sending GET Request to refresh mysql databse has exception : {}", e);
            e.printStackTrace();
        }
        return result;
    }

 

以上是关于Java中使用HTTP阻塞式调用服务器API的主要内容,如果未能解决你的问题,请参考以下文章

java-线程

java nio学习三:NIO 的非阻塞式网络通信

进程线程模型

[Java - 调用WebService]{http://schemas.microsoft.com/ws/2005/05/addressing/none}ActionNotSupported(代码片

Akka HTTP:将来阻塞会阻塞服务器

在java中使用非阻塞I/O发送消息(NIO API)