首页 > 代码库 > Jersey中处理POST格式的Best Practice

Jersey中处理POST格式的Best Practice

REST中,我们可以把接受POST请求的方式写成如下的方式:

    @POST

    @Consumes(MediaType.APPLICATION_JSON)

    public Response createProduct(CreateProductJson createProductJson, @Context UriInfo uriInfo) {


CreateProductJson就是我们服务器用来接收CreateProudct这样一个请求的JSON表达方式,然后我们可以通过createProductJson.getProduct()这样类似的方法得到product对象,然后再将围绕着product这一领域对象进行处理


这样看似还不错,CreateProductJson就类似成为了我们的DTO对象,但是这里有一个问题就是CreateProductJson的容错性比较差。假如,我们当前的product需要两个字段:name、price。但是客户端如果多传输给我们了一个description,那么很有可能我的反序列化CreateProductJson对象的时候就会抛异常,丢出400 Bad Request错误。这么严格的要求往往是没有必要的。一些相关的解释可以参考Martin Fowler的讲解《Customer Driven Contract》


那我们怎么能够做的容错性更好呢?其实非常简单

    @POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    public Response createProduct(Form form) {
    

我们只要再定义一个transformer就行了,比如,定义ProductForm,它其中含有一个方法getProduct(),这个方法中我们只从form去取我们真正需要的数据,对于多余的数据,我们可以置之不理。