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的方法实现异步:

1public String requestRefresh(String token, String clusterName){ 2 String result = null; 3 try{ 4 // 打开和URL之间的连接 5 URL url = new URL(URL_Refresh_Couchbase_Cluster); 6 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 7 connection.setDoOutput(true); 8 connection.setDoInput(true); 9 connection.setUseCaches(false); 10 connection.setRequestMethod("GET"); 11 connection.setRequestProperty("content-type", "application/x-www-form-urlencoded"); 12 OutputStreamWriter out = new OutputStreamWriter(connection.getOutputStream(),"UTF-8"); 13 // 把数据写入请求的Body 14 out.write("token=" + token + "&cluster=" + clusterName); //参数形式跟在地址栏的一样 15 out.flush(); 16 out.close(); 17 // 获取数据,将返回的输入流转换成字符串 18 InputStream inputStream = connection.getInputStream(); 19 InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); 20 BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 21 result = bufferedReader.readLine(); 22 // 释放资源 23 bufferedReader.close(); 24 inputStreamReader.close(); 25 inputStream.close(); 26 connection.disconnect(); 27 }catch (Exception e){ 28 log.info("(requestRefresh) sending GET Request to refresh mysql databse has exception : {}", e); 29 e.printStackTrace(); 30 } 31 return result; 32 }
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''

SpringBoot自定义序列化的使用方式

场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x

00:Java简单了解

浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。