java - 如何处理 API 中格式不正确的请求

标签 java spring api exception

我想知道处理此类请求的正确方法是什么。我有一个来自 UI 的删除请求,它是一个 ID 列表,它们是整数。所以请求看起来像:

www.myui.com/delete/1,2,3,4 

这是一个格式良好的请求。但是,如果出于任何原因的请求来自 curl 请求或 postman 等,则其格式可能如下:

www.myui.com/delete/1,,3,4 

在这种情况下,第二个索引将包含 null,因为它正在检查整数。但是,如果我们期望的是一个字符串列表,那么如果它的格式类似于/1, ,2,3, 4,那将是一个简单的空字符串或 n 数量的空白字符,因此我将不得不遍历请求并检查如果字符串列表中的字符串只是空白并返回 404。

我应该在 Controller 中执行此操作还是允许这种类型的请求传递并最终在 dao 中抛出异常,因为它将尝试删除一个为 null 或只是空白的 id不会存在于数据库中。

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

@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);
    }

最佳答案

简而言之,快速失败是一种更好的方法,因为它有助于尽早快速地检测到故障,尽管您可能还会考虑应用程序的业务需求和一般设计指南,如果它应该宽松一些,那么您可能会采用类似:

service.delete(ids.stream().filter(Objects::nonNull).collect(Collectors.toList()));

并返回一个响应主体,其中至少包含一些已删除的项目。

如果您的申请必须严格,那么应该尽快返回错误的请求,就像您已经在做的那样。

此外,您还必须考虑到您的服务和/或 DAO 并非专门从 Controller 调用,因此也必须在那里实现验证和/或检查,并且如果出现以下情况,请尽量不要让格式错误的请求访问数据库您已经知道它们会导致错误,那只会浪费流量。

最后,我希望你的情况下的整数 id 不是数据库生成的,在这种情况下,这将是一个主要的安全问题,因为你通过你的 api 公开了持久性细节,攻击者可能会清除你的数据库或其中的一部分通过仅发送递增整数列表。我建议您使用某种随机生成的唯一 ID 来公开 api(这并不意味着您应该摆脱整数基索引)。

关于java - 如何处理 API 中格式不正确的请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50671183/

相关文章:

java - Apache POI : OutOfMemory

java - 使用现有的 Servlet 类或 JSP - Servlet 列表为空

android - 在 API 小于 19 (Android) 中暂停/恢复动画?

javascript - 如何使用ajax从api中的json获取特定数据。 json 对我来说看起来很奇怪

java - 双向 Netty 服务器

java - 使用文件协议(protocol)在java中打开当前目录中的文件

Java Tetris - 遍历双数组

java - Hibernate不会创建表,即使它在sql中显示

spring - 为可与@PropertySource 一起使用的 AbstractAnnotationConfigDispatcherServletInitializer 设置事件配置文件?

c++ - Cuda中的数组乘法产生错误