我正在尝试创建一个REST服务,该服务接受来自客户端的对象列表并返回一个zip文件。 我知道如何回复zip文件好。 但我现在正试图找出一种方法,我可以将一个对象列表从REST客户端/浏览器传递给Rest服务,以及如何在REST服务中接受List。
这应该通过XML输入完成吗? 或者@consumes注释可以帮助吗?
非常感谢。
逊
答案 0 :(得分:1)
你需要更清楚地思考你想做什么。获取一个对象列表并返回它们的ZIP是没有充分理由的;你也可以使用本地zip程序(几乎所有的计算机都有)。这表明我们需要看一些明智的事情:例如,你将返回ZIP的对象的名称列表,这很有意义。还有其他明智的事情你也可以做,但你必须在脑海中解决你想要发生的事情。
因为你提到“@consumes annotation”,我假设你正在使用JAX-RS(即Java)。这很好,因为完全有可能用它进行动态ZIP生成;您要生成的内容类型为application/zip
。我发现处理返回事物描述列表规范的最简单方法是作为一个包装列表,你可以使用JAXB之类的东西进行映射(它为你提供XML支持;一些框架也支持JSON关闭相同的数据模型)。要做一个包装列表,你可以使用这样的东西:
@XmlRootElement
public class Wrapper {
@XmlElement
public List<String> item;
}
然后生成/处理这样的XML文档(三项列表):
<wrapper>
<item>foo</item>
<item>...</item>
<item>bar</item>
</wrapper>
您需要设置@Consumes
注释,以便接受的内容类型为application/xml
(至少),并且还要考虑涉及的操作类型和资源。
[编辑]:为了创建一个以字符串列表作为参数的REST服务,最简单的方法确实是使用包装器对象,就像上面一样。 (您无法获取原始列表;当它在线上时,它需要是格式良好的XML文档。)然后我们设置带注释的服务方法,如下所示:
@POST
@Path("somewhere/{id}")
@Consumes("application/xml")
@Produces("application/zip")
public Response getSomeBytesForList(@PathParam("id") String id, Wrapper req) {
List<String> items = req.item; // For example...
byte[] zip = generateZipBytes(id, items); // or however
return Response.ok(zip).type("application/zip").build();
}
关键是req
参数(当然,名称是任意的)是不注释的唯一参数,它是一个支持JAXB的类型,并且有一个整体@Consumes ("application/xml")
注释,以启用请求正文的JAXB处理。 (我通过直接生成Response
来处理ZIP的返回,而不是依靠框架来为我处理;这使我可以更精确地控制内容类型处理。)
另请注意,一些框架也可以将JAXB注释的对象作为JSON文档传输,只需要一些额外的注释;您只需声明该方法可以同时接受application/xml
注释中的“application/json
”和“@Consumes
”。我不知道这是否适用于您正在使用的框架(我只使用Apache CXF进行了测试)。