首先,对不起我的英语。其次,我知道有很多关于我要谈论的内容的现有帖子,但据我搜索,我发现没有(真正)与我的“特定”问题相关。所以我们开始吧。
我目前正在开发一个 JAVA RESTful Web 服务。此 Web 服务的目标是将一些 XML 文件(更准确地说,一些 OVAL 定义)发送到连接的客户端。我已经看到了 4 个“解决方案”:
- 将所有 XML 文件内容放在一个字符串中(如果需要,将此字符串编码为 base64)并将该字符串发送到客户端
- 将所有 XML 文件内容放入 Byte[] 并将 Byte[] 发送到客户端
- 使用 FTP 辅助服务器
- 通过在套接字上流式传输(InputStream/OutputStream)发送/接收文件
目前,我决定选择第 4 号解决方案。您可以在下面看到有关文件传输的代码的某些部分。
服务器端:
@Path("/sendXML")
@Produces(MediaType.TEXT_PLAIN)
@GET
@Path("/sendXML")
@Produces(MediaType.TEXT_PLAIN)
public String getHtml(@Context HttpServletResponse serv) throws IOException {
ServletOutputStream o =serv.getOutputStream();
try {
FileInputStream fis = new FileInputStream(new File("xml file to send"));
int c;
while ((c = fis.read()) != -1) {
o.write(c);
}
fis.close();
o.close();
} catch (Exception e) {
System.err.println("e");
}
return "OK" ;
}
客户端:
try {
URL u = new URL("http://localhost:8080/ws.example.filetransfer/rest/sendXML");
HttpURLConnection uc = (HttpURLConnection) u.openConnection();
InputStream is = uc.getInputStream();
try {
FileOutputStream fos = new FileOutputStream(new File("path where the file will be saved"));
int c;
while ((c = is.read()) != -1) {
fos.write(c);
}
is.close();
fos.close();
} catch (Exception e) {
System.err.println("FileStreamsTest: " + e);
}
} catch (Exception e) {
e.printStackTrace();
}
我正在 Eclipse 下开发和测试我的程序。一切似乎都很好,XML 文件很好地从服务器发送到客户端,并将其保存在磁盘上。这是我启动客户端程序时的控制台输出(服务器已经启动):
<?xml version="1.0"?><hello> Hello Jersey</hello>
<html> <title>Hello Jersey</title><body><h1>Hello Jersey</body></h1></html>
<?xml version="1.0" encoding="UTF-8"?>
<oval_definitions xsi:schemaLocation="http://oval.mitre.org/XMLSchema/oval- definitions-5 oval-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#hpux hpux-definitions-schema.xsd http://oval.mitre.org/XMLSchema/oval-common-5 oval-common-schema.xsd http://oval.mitre.org/XMLSchema/oval-definitions-5#unix unix-definitions-schema.xsd" xmlns="http://oval.mitre.org/XMLSchema/oval-definitions-5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:oval="http://oval.mitre.org/XMLSchema/oval-common-5" xmlns:oval-def="http://oval.mitre.org/XMLSchema/oval-definitions-5">
<generator>
<oval:product_name>The OVAL Repository</oval:product_name>
<oval:schema_version>5.10.1</oval:schema_version>
<oval:timestamp>2012-06-29T05:09:57.714-04:00</oval:timestamp>
</generator>
[...]
如您所见,当客户端接收 XML 文件时,除了将内容写入磁盘(在代码中指定的文件中)之外,它还将内容写入标准输出。在标准输出上写是一个小问题,因为内容也写在磁盘上,但这是正常的,还是一种 Eclipse 错误,或者我的错误..?
最后,这是我的问题:
- 根据您的说法,使用 JAVA REST Web 服务传输 XML 文件的最佳方法是什么?
- 您认为流媒体解决方案是一个好方法吗?
- 我是否很好地实现了这个解决方案(我对一些代码有疑问,比如使用 @Contex 属性)?
感谢大家的关注和回答!海森89