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去取我们真正须要的数据。对于多余的数据,我们能够置之不理。