在设计一个应该返回相同数据的不同表示形式(如JSON,XML)的Web服务时,您认为哪种方法是最好的方法。
要求是将业务逻辑与写入实际XML / JSON响应的部分完全分开,具体取决于HTTP请求中收到的“Accept”标头。
我认为这是许多Web服务所具有的常见问题。 您可以帮助我的任何提示/设计模式/维基/项目?
答案 0 :(得分:3)
第一个问题是您要使用哪种HTTP协议:REST还是SOAP?
使用REST时,我会创建一个服务,每个表示都有不同的使用者方法。 在这个REST服务的背后,您可以让您的真实服务和消费者方法调用完全相同的业务逻辑。 您可以根据要返回的表示来修改路径。
例如:
@GET
@Path("/json/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response readAsJson(@PathParam("id") String id) throws JAXBException {
final Object obj = dao.get(id);
if (obj == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
return Response.ok(obj).build();
}
@GET
@Path("/xml/{id}")
@Produces(MediaType.APPLICATION_XML)
public Response readAsXml(@PathParam("id") String id) throws JAXBException {
final Object obj = dao.get(id);
if (obj == null) {
return Response.status(Response.Status.NOT_FOUND).build();
}
return Response.ok(obj).build();
}
答案 1 :(得分:1)
在您的应用程序中包含一个新的委托图层,该图层将您的所有请求委派给您的服务图层。 在ServiceDelegator类中,您可以使用多个方法(具有不同的返回类型),这些方法将调用服务的目标方法。 您的业务方法将存在于您的服务类中,因为ServiceDelegator类的多个方法将调用您的服务的相同业务方法。
@Path("/root")
public class ServiceDelegator{
@GET
@Path("/getDetailsAsXML")
@Produces(MediaType.APPLICATION_XML)
public Todo getDetailsAsXML() {
return new GetDetailsService().getDetails();
}
@GET
@Path("/getDetailAsJSON")
@Produces(MediaType.APPLICATION_JSON)
public Todo getDetailsAsJSON() {
return new GetDetailsService().getDetails();
}
}
public class GetDetailsService{ // your service class containing the business methods
public Todo getDetails() { // Todo is just a pojo return type which would finally be converted into either XML or JSON type based on the delegator method that invoked this service
Todo todo = new Todo();
todo.setSummary("This is my first todo");
todo.setDescription("This is my first todo");
return todo;
}
}
public class Todo {
private String summary;
private String description;
// Getters and Setters
}
答案 2 :(得分:0)
另一种方法:
您可以使用多种返回类型(MediaTypes)声明您的服务方法,如下所述:
@Path("/root")
public class GetDetailsService{
@GET
@Path("/getDetails")
@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
public Todo getDetails() {
Todo todo = new Todo(); // Todo is just a pojo return type which would finally be converted into either XML or JSON type based on the "Accept" header of your HTTP request.
todo.setSummary("This is my first todo");
todo.setDescription("This is my first todo");
return todo;
}
}
public class Todo {
private String summary;
private String description;
// Getters and Setters
}
现在,将根据" Accept"返回JSON类型或XML类型。您的HTTP请求的标头。