提供JSON / XML /等的Web服务。回复

时间:2014-09-15 12:18:04

标签: java xml json web-services rest

在设计一个应该返回相同数据的不同表示形式(如JSON,XML)的Web服务时,您认为哪种方法是最好的方法。

要求是将业务逻辑与写入实际XML / JSON响应的部分完全分开,具体取决于HTTP请求中收到的“Accept”标头。

我认为这是许多Web服务所具有的常见问题。 您可以帮助我的任何提示/设计模式/维基/项目?

3 个答案:

答案 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请求的标头。