Jersey中处理POST格式的Best Practice

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

    @POST

    @Consumes(MediaType.APPLICATION_JSON)

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


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


这样看似还不错,CreateProductJson就类似成为了我们的DTO对象,可是这里有一个问题就是CreateProductJson的容错性比較差。假如,我们当前的product须要两个字段:name、price。可是client假设多传输给我们了一个description,那么非常有可能我的反序列化CreateProductJson对象的时候就会抛异常,丢出400 Bad Request错误。这么严格的要求往往是没有必要的。

一些相关的解释能够參考Martin Fowler的解说《Customer Driven Contract》


那我们怎么可以做的容错性更好呢?事实上很easy

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

我们仅仅要再定义一个transformer即可了,比方。定义ProductForm,它当中含有一个方法getProduct(),这种方法中我们仅仅从form去取我们真正须要的数据。对于多余的数据,我们能够置之不理。

posted @ 2017-04-09 22:31  mfmdaoyou  阅读(420)  评论(0编辑  收藏  举报