Java访问远程http服务器上数据的简便方法

Java开发项目中,有时会访问远程http服务器上的数据,数据可能是xml格式或者json格式等。这里我们通过例子来看一下两种实现方式的对比。

本例子中有一个servlet,对外提供json格式的雇员信息查询。Servlet访问数据库的员工表,保存了员工的信息,如下:

EID   NAME       SURNAME        GENDER  STATE        BIRTHDAY        HIREDATE         DEPT         SALARY

1       Rebecca   Moore      F       California 1974-11-20       2005-03-11       R&D          7000

2       Ashley      Wilson      F       New York 1980-07-19       2008-03-16       Finance    11000

3       Rachel      Johnson   F       New Mexico     1970-12-17       2010-12-01       Sales         9000

4       Emily         Smith        F       Texas        1985-03-07       2006-08-15       HR    7000

5       Ashley      Smith        F       Texas        1975-05-13       2004-07-30       R&D          16000

6       Matthew Johnson   M     California 1984-07-07       2005-07-07       Sales         11000

7       Alexis        Smith        F       Illinois       1972-08-16       2002-08-16       Sales         9000

8       Megan     Wilson      F       California 1979-04-19       1984-04-19       Marketing        11000

9       Victoria    Davis        F       Texas        1983-12-07       2009-12-07       HR    3000

Servlet的doGet函数,接收json格式的雇员id字符串,通过数据库查询对应的雇员信息,形成json格式的雇员信息清单返回。下面的代码省略了读取数据库,生成雇员清单的过程:

protected void doGet(HttpServletRequestreq, HttpServletResponse resp) throws ServletException, IOException {

StringinputString=(String) req.getParameter("input");

//inputString输入值是:"[{EID:8},{EID:32},{EID:44}]";

if(inputString==null) inputString="";

StringoutputString ="";

{...}//此处省略通过inputString查询数据库生成outputString的代码

//outputString生成结果是

//"[{EID:8,NAME:"Megan",SURNAME:"Wilson",GENDER:"F",STATE:\...";

resp.getOutputStream().println(outputString);

resp.setContentType("text/json;charset=GBK");

}

Java程序要访问这个httpservlet,取得EID为1、2的员工信息,之后按照EID的降序排列。具体思路是:

1、  引入开源项目httpclient,访问servlet取得结果。

2、  引入开源项目json-lib,解析返回的字符串。

3、  使用比较法,按照EID的降序排列。

示例代码如下:

public static voidmyHTTP() throws Exception{

//下面定义http的url

URLurl =

newURL("http://localhost:6080/myweb/servlet/testServlet?input=[{EID:1},{EID:2}]");

URIuri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(),url.getPort(), url.getPath(), url.getQuery(), null);

//下面发出http的请求,并接受返回结果

CloseableHttpClientclient = HttpClients.createDefault();

HttpGetget = new HttpGet(uri);

CloseableHttpResponseresponse = client.execute(get);

StringmyJson=EntityUtils.toString(response.getEntity());

//下面将读取的内容解析成json对象

JSONArray jsonArr = JSONArray.fromObject(myJson );

//下面完成json数据排序(降序)

JSONObject jObject = null;

for(inti = 0;i<jsonArr.size();i++){

longl = Long.parseLong(jsonArr.getJSONObject(i).get("EID").toString());

for(intj = i+1; j<jsonArr.size();j++){

longnl = Long.parseLong(jsonArr.getJSONObject(j).get("EID").toString());

if(l<nl){

jObject= jsonArr.getJSONObject(j);

jsonArr.set(j,jsonArr.getJSONObject(i));

jsonArr.set(i,jObject);

}

}

}

System.out.println(jsonArr.toString());

}

需要引入开源项目json-lib,其依赖的包是:

json-lib-2.4-jdk15.jar

ezmorph-1.0.6.jar

commons-lang.jar

commons-beanutils.jar

commons-logging.jar

commons-collections.jar

引入开源项目httpclient,其依赖的包是:

commons-codec-1.6.jar

commons-logging-1.1.3.jar

fluent-hc-4.3.5.jar

httpclient-4.3.5.jar

httpclient-cache-4.3.5.jar

httpcore-4.3.2.jar

httpmime-4.3.5.jar

从这个例子来看,Java要完成需求,需要引入两个开源项目,jar包也可能有重复的地方。同时,虽然myHTTP函数已经实现了http数据访问和排序,但是通用性并不强。如果需要按照升序排序或者按照多个字段排序的话,就需要改程序了。如果希望myHTTP能够支持通用的,类似SQL那样灵活的数据访问和处理,就要实现动态表达式解析,代码会很复杂。

Java实现http数据的访问和处理,也可以用集算器esProc来配合Java实现,好处是只需要引入一个项目,就能够用简单的代码实现动态的访问和排序。集算器可以很方便完成远程http服务器的数据的读取、计算。为了实现动态的处理,可以把排序表达式作为一个参数传递给esProc,如下图:

sortBy参数的值为:EID:-1。集算器访问http数据的程序只需要6行代码,如下:

A1:定义了要传给servlet的输入参数,也就是json格式的员工id列表。

A2:定义了httpfile对象,url是

http://localhost:6080/myweb/servlet/testServlet?input=[{EID:1},{EID:2}],字符集是GBK。

A3:读取A2这个httpfile对象返回的结果。

A4:逐个解析每个员工的json格式的信息,整理成一个序列。

A5:对数据排序,集算器先计算宏${sortBy}中的参数sortBy,之后执行的语句是A4.sort(EID:-1),也就是按照EID的降序排序;

A6:将A5中的结果返回给调用这段集算器程序的Java代码。

如果排序的字段和方式发生变化,不用修改程序,只要改变sortBy参数即可。例如:要按照eid的升序和name的降序排序,要将sortBy改为:EID:1,NAME:-1即可,最终执行的排序语句是A4.sort(EID:1,NAME:-1)。

在Java程序中可以很方便的调用这段esProc程序,使用esProc提供的jdbc即可完成。将上述esProc程序保存为test.dfx文件的话,Java调用的代码如下:

//建立esProc jdbc连接

Class.forName("com.esproc.jdbc.InternalDriver");

con= DriverManager.getConnection("jdbc:esproc:local://");

//调用esProc 程序(存储过程),其中test是dfx的文件名

com.esproc.jdbc.InternalCStatementst;

st =(com.esproc.jdbc.InternalCStatement)con.prepareCall("calltest(?)");

//设置参数

st.setObject(1,"EID:1,NAME:-1");//集算器的输入参数,也就是动态排序表达式

//执行esProc存储过程

ResultSetset=st.executeQuery();

while(set.next())System.out.println("EID="+set.getInt("EID"));

这里的集算器代码比较简单,可以在Java程序中直接调用,不必再写集算器的脚本文件(比如上边的test.dfx)。具体代码如下:

st=(com.esproc.jdbc.InternalCStatement)con.createStatement();

ResultSet set=st.executeQuery("=httpfile(\"http://localhost:6080/myweb/servlet/testServlet?input=[{EID:1},{EID:2}]\",\"GBK\").read()[email protected]().sort(EID:1,NAME:-1)");

上面的Java代码直接调用了一句集算器语句:从http服务器读取数据,按照指定字段排序之后,将结果以ResultSet返回给Java程序。

时间: 2024-10-25 22:59:51

Java访问远程http服务器上数据的简便方法的相关文章

第四章 从远程rsync服务器同步数据

第四章 从远程rsync服务器同步数据 使用rsync从远程rsync服务器同步数据 第一节 rsync配置 拉:          rsync        选项         用户名@备份源服务器IP::共享模块名  目标目录 推:         rsync        选项         备份源目录   用户名@目标服务器IP::共享模块名 C/S模式: 服务端==>    远程服务器为:DataServer.  IP地址为:192.168.88.8 客户端==>    备份服务

Linux下不借助工具实现远程linux服务器上传下载文件

# Linux下不借助工具实现远程linux服务器上传下载文件 ## 简介 - Linux下自带ssh工具,可以实现远程Linux服务器的功能- Linux下自带scp工具,可以实现文件传输功能 ## 登录服务器 - `ssh [email protected]` 登录服务器```PC:~$ ssh [email protected][email protected]'s password: ``` ## 文件传输 - 下载文件- `scp [email protected]:/data/log

java实现读取ftp服务器上的csv文件

定义ftp操作接口 import java.io.InputStream; import java.util.List; import org.apache.commons.net.ftp.FTPClient; /** * FTP服务器操作*/ public interface iFtpServU { public FTPClient ftp(String ip, String user, String password); public List<String[]> csv(InputStr

eclipse远程debug服务器上的项目(Tomcat),打开、关闭及常见错误汇总

我们工作中,有时候测试/生产环境,出现的结果会与我们预计的不一样,只看代码又看不出去问题所在,这个时候就需要远程debug下服务器上的项目. 注意:(1)需要debug的代码,本机代码需与服务器上一致.(2)保证服务器下开了允许远程debug的端口 一.打开远程debug 1.右击要debug的项目,Run As ->Debug Configurations,找到Remove Java Application,如下: 填下远程主机IP和端口 备注:如何找预留的debug端口:一般而言,找到对应项

使用Visual VM 监控远程Linux服务器上的 JVM的垃圾回收情况

注:以下用到的ip均为随机乱写的,非真实IP 一.启动服务器jar包 本人服务器运行的 springboot  程序,所以直接在启动jar包时,添加相关的参数即可 .(ip为乱写的) java -Dcom.sun.management.jmxremote.port=19100 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.ho

本地远程连接服务器上的Jupyter Notebook设置方法

完整原文:https://hongwan.xyz/archives/ 使用Jupyter可以在本地电脑直接新建和编辑linux服务器的代码,比如python和R,非常方便: 本机为:Win10 服务器:CentOS Linux release 7.3.1611 1.远程服务器安装Jupyter 本人之前安装Anaconda自带了jupyter notebook,因此可以直接使用.如果没有,可通过以下命令安装: pip install jupyter notebook 2.服务器端Jupyter配

linux挂载远程windows服务器上的ISO,给内网的服务器安装软件

原文: http://blog.csdn.net/chagaostu/article/details/45195817 给内网的服务器安装软件 直接用yum install XXX的话,会告知找不到源.公司屏蔽外网就是烦啊. 在公司的windows服务器上发现源,CentOS-6.5-x86_64-bin-DVD1.iso 第一步要挂载远程服务器,使用samba mount -t cifs -o username="user",password=XXX   //XXX.XX.XX.XX

使用PhpStrom等IDE编辑 远程linux服务器上的文件 实时更新

习惯了在linux上 vim进行PHP的开发,突然忘了IDE的感觉,所以想到了.通过PhpStrom等IDE直接编辑 samba共享到 mac或者windows本地的磁盘进行编辑. 为了忘却的纪念,有了这篇文章. 1. 第一步:Linux服务器上 安装 samba服务,共享服务器给mac或windows本地 1)yum安装 # yum install -y samba samba-client samba-swat 2)启动(启动:service smb start:停止:service smb

SFTP远程连接服务器上传下载文件-vs2010项目实例

本项目仅测试远程连接服务器,支持上传,下载文件,更多功能开发请看API自行开发. 环境:win7系统,vs2010 vs2010项目实例下载地址:CSDN下载 如果没有CSDN积分,百度网盘下载(密码:uxnt) 文件目录介绍: 1.libssh2.sln是vs2010的解决方案,用vs2010打开(如图1所示): include是需要导入的头文件,lib是需要使用的lib文件(如图2所示): 图1 图2 2.解决方案:"libssh2"(如图3所示) 这里只需要编译运行demo项目即