Java 如何处理API中不正确的格式化请求

Java 如何处理API中不正确的格式化请求,java,spring,api,exception,Java,Spring,Api,Exception,我想知道处理这类请求的正确方法是什么。我有一个来自UI的删除请求,它是一个ID的列表,这些ID是整数。因此,请求可以如下所示: www.myui.com/delete/1,2,3,4 这是一个格式良好的请求。但是,如果出于任何原因的请求来自curl请求或邮递员等,则其格式可能如下所示: www.myui.com/delete/1,,3,4 在这种情况下,第二个索引将包含null,因为它正在检查整数。但是,如果我们希望得到一个字符串列表,那么它将是一个简单的空字符串,或者如果它的格式为/1

我想知道处理这类请求的正确方法是什么。我有一个来自UI的删除请求,它是一个ID的列表,这些ID是整数。因此,请求可以如下所示:

www.myui.com/delete/1,2,3,4 
这是一个格式良好的请求。但是,如果出于任何原因的请求来自curl请求或邮递员等,则其格式可能如下所示:

www.myui.com/delete/1,,3,4 
在这种情况下,第二个索引将包含null,因为它正在检查整数。但是,如果我们希望得到一个字符串列表,那么它将是一个简单的空字符串,或者如果它的格式为/1、2、3、4,那么它将是n个空格字符,因此我必须遍历请求并检查字符串列表中的字符串是否只有空格,然后抛出404

我应该在控制器中执行此操作,还是允许这种类型的请求传递,并最终在dao中引发异常,因为它将尝试删除一个id,该id要么为null,要么仅为空白,在DB中不存在

下面是我当前如何处理请求的示例,请求是一个整数列表

@DeleteMapping(value="/delete/{ids}")
    public ResponseEntity delete(@PathVariable("ids") List<Integer> ids)
            throws DatabaseException {
        if (ids.contains(null)) {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
        service.delete(ids);
        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }
@DeleteMapping(value=“/delete/{ids}”)
公共响应属性删除(@PathVariable(“ids”)列表ID)
抛出数据库异常{
if(id.contains(null)){
返回新的响应属性(HttpStatus.BAD_请求);
}
服务。删除(ID);
返回新的响应属性(HttpStatus.NO_内容);
}

一旦发现错误,立即处理是正确的。在这种情况下,在控制器级别检测到错误的请求,因此在那里处理它是最好的选择


尽管您的方法很好,但查看
@ResponseHandler
可能会有所启发,因为它可以用于在
控制器
级别概括已知异常的处理
service.delete(ids.stream().filter(Objects::nonNull).collect(Collectors.toList()));
并返回至少包含多个已删除项的响应正文

如果您的应用程序必须严格,那么应该尽快返回错误的请求,因为您已经这样做了

此外,您还必须考虑到,您的服务和/或DAO并不是专门从控制器调用的,因此也必须在那里执行验证和/或检查,并且如果您已经知道错误的请求会导致错误,请尽量不要让错误的请求进入数据库,这只会浪费流量

最后,我希望您案例中的整数ID不是DB生成的,在这种情况下,这将是一个主要的安全问题,因为您正在通过api公开持久性详细信息,攻击者只需发送递增整数列表,即可清除您的数据库或其部分。我建议您使用某种随机生成的唯一ID通过api公开(这并不意味着您应该去掉整数基索引)