【问题标题】:API REST when IDs are URLsID 为 URL 时的 API REST
【发布时间】:2019-07-11 02:02:21
【问题描述】:

我正在开发 API REST,但遇到以下问题:在某些情况下,我的资源 ID 是 URL。

API 用于两者,ID 为 UUID 格式的软件,以及识别资源的唯一方法是使用其路径的文件系统。

所以,为了检索资源,我使用如下 GET 语句: - http://localhost/files/{id}

当我检索存储在软件数据库中的文档时,{id}​​ 类似于“2ab89005-b938-46c8-9d22-3a12a3c40672”,但是当文档在文件系统中时,{id}​​ 可以是类似“/documents/2018/april/myfile.pdf”的东西。

我该如何处理这种情况?到目前为止,我正在通过 URL“http://localhost/files/”(不带 {id})进行 GET 请求,并在正文中以 JSON 格式包含所需的信息:

{
    "id": {id}
}

当然,我知道这不是一个好的做法,但我不知道在这种情况下如何实现 REST 架构。 我正在使用 Java + Spring Boot。

谢谢。


已实施的解决方案: 最后,我创建了以下端点:http://localhost/files/?id={id}。 这样做的原因是因为调用我的应用程序不知道它是在请求存储在文件系统中还是在我的数据库中的资源。 如果应用程序知道,我认为最好实现两个端点:http://localhost/files/?id={id}(用于文件系统)和http://localhost/files/{id}(用于数据库)。

【问题讨论】:

    标签: java rest api spring-boot


    【解决方案1】:

    由于Path Manipulation Vulnerability,用户在FS 中选择文件的能力是一个非常糟糕的主意。

    但如果你想这样做,你可以将 String 设置为路径变量,然后解码你的请求字符串:

    @RestController
    @RequestMapping("test")
    public class MainController {
    
        @GetMapping("/{id}")
        public Mono<String> main(@PathVariable("id") String id){
            return Mono.just(id);
        }
    }
    

    【讨论】:

    • 你好。我对您的解决方案有疑问,因为当我在 Postman 中放置一个像您这样的 URL(在我的情况下:%2Fdocuments%2Finvoice20190112.pdf)时,服务器回复我:HTTP 状态 400 – 错误请求。但是,我使用了“public String main(@PathVariable("id") String id)”。谢谢。
    • 可能是您在请求中忘记了斜线或未正确映射 url,4XX 响应说明客户端错误。
    • 不,我什么都没忘记。我也复制了你的例子,我得到了同样的错误。我认为是因为 Apache:stackoverflow.com/questions/4069002/…
    • 当然,我是在 Netty 上运行的。此外,如您所见,它使用反应器库。
    • 尝试使用base64编码的字符串或sha encription,但在这种情况下,你应该在你的数据库中使用虚拟列之类的东西。
    猜你喜欢
    • 2021-07-24
    • 2020-03-29
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2017-10-06
    • 2020-10-13
    相关资源
    最近更新 更多