我正在编写REST Web应用程序(NetBeans 6.9,JAX-RS,TopLink Essentials)并尝试返回JSON 和 HTTP状态代码.我已准备好代码并且在从客户端调用HTTP GET方法时返回JSON.实质上:
@Path("get/id")
@GET
@Produces("application/json")
public M_?? getMachineToUpdate(@PathParam("id") String id) {
// some code to return JSON ...
return myJson;
}
Run Code Online (Sandbox Code Playgroud)
但是,我也想用JSON数据一起返回的HTTP状态代码(500,200,204,等).
我试着用HttpServletResponse:
response.sendError("error message", 500);
Run Code Online (Sandbox Code Playgroud)
但这使得浏览器认为它是"真正的"500,因此输出网页是一个常规的HTTP 500错误页面.
我想返回一个HTTP状态代码,以便我的客户端JavaScript可以根据它处理一些逻辑(例如在HTML页面上显示错误代码和消息).这是可能的还是HTTP状态代码不能用于此类事情?
我正在尝试为我的一些webservice调用添加一些响应标头.我使用CXF 2.1.2和JAX-RS编写了我的Web服务.我需要返回一个对象,我还想在Response中添加一些标题. 如果不返回javax.ws.rs.core.Response对象,如何在响应中添加标头并仍然返回我的javabean?
我正在尝试让REST服务从本地硬盘返回一个zip文件.以下就是我在做什么
@Path("/interface3/{Ent_id}/{esf_app_id}/{esf_app_ver}")
public class Interface3Mock {
// This method is called if TEXT_PLAIN is request
@GET
@Produces("application/zip")
public Response callInterface3_text(
@PathParam("Ent_id") Integer entitlement_id,
@PathParam("eapp_id") String eapp_id,
@PathParam("eapp_ver") String eapp_ver) {
File f = new File("D:\\Documentation\\Documentation.zip");
String mt = new MimetypesFileTypeMap().getContentType(f);
return Response.ok(f, mt).build();
}
}
Run Code Online (Sandbox Code Playgroud)
现在当我使用浏览器即.Internet Explorer和URL中的键http://localhost:9788/mockRESTServer/rest/interface3/123456/k123/l345
我看到一个文件下载对话框,上面写着"你想保存文件l345`.
我想让它问我的zip下载即.D:\\Documentation\\Documentation.zip.但不知何故,它占用了请求URL中的最后一个参数.
使用OpenCSV,我可以在光盘上成功创建一个CSV文件,但我真正需要的是允许用户使用下载按钮下载CSV,我不需要保存在磁盘上,只需下载即可.有任何想法吗?
@GET
@Path("/downloadCsv")
public Object downloadCsv() {
CSVWriter writer;
FileWriter wr;
//Or should I use outputstream here?
wr= new FileWriter("MyFile.csv");
writer = new CSVWriter(wr,',');
for (Asset elem: assets) {
writer.writeNext(elem.toStringArray());
}
writer.close();
}
Run Code Online (Sandbox Code Playgroud)
编辑:我不想在光盘上保存/读取文件EVER
我有一个RESTful服务器实现以及一个供客户端进行调用的库,所有这些都使用JAX-RS。服务器组件分为接口FooResource和实现FooResourceService。
为了使客户端和服务器库共享RESTful路径和其他定义,我想将FooResource接口拆分为自己的项目:
@Path(value = "foo")
public interface FooResource {
@GET
public Bar getBar(@PathParam(value = "{id}") int id) {
Run Code Online (Sandbox Code Playgroud)
我想在响应中设置一些标题。一种简单的方法是@Context HttpServletResponse在方法签名中使用:
public Bar getBar(@PathParam(value = "{id}") int id, @Context HttpServletResponse servletResponse) {
Run Code Online (Sandbox Code Playgroud)
但是问题在于这暴露了接口中的实现细节。更具体地说,它突然需要我的REST定义项目(在客户端和服务器库之间共享)来引入javax.servlet-api依赖项-客户端不需要(或不需要)某些东西。
我的RESTful资源服务实现如何设置HTTP响应标头而不在资源接口中引入依赖关系?
我看到一篇推荐我将HttpServletResponse作为类成员注入的帖子。但是,如果我的资源服务实现是单例的,这将如何工作?它是否使用某种具有线程局部变量的代理,或者即使多个线程同时使用singleton类,也能找出正确的servlet响应的代理?还有其他解决方案吗?