API POST端点和图像处理

时间:2018-08-02 19:09:08

标签: json database api software-design

因此,对于我的Android应用程序,我不仅获得了一些我想通过JSON格式发布到API端点的数据,而且其中一个数据也是图像。除了图像之外的所有内容都进入了postgresql数据库。我想将图像放在某个地方(不重要的地方),然后将指向该图像的链接放在数据库中。

这就是问题,虽然该图像与我发送到API终结点的其他数据相连,然后将其发送到数据库中,但我会将图像发送到其他地方,然后将链接放置在其他时间。所以这是我想要克服的精神障碍:

我将如何发送这两个单独的数据块(一个图像,然后是所有其他数据,在一个JSON对象中),并将与该JSON对象相关联的图像放入数据库,而不会将图像和数据混合在一起是因为有多个用户在做同一件事?

为简单起见,假设我将以下信息作为单个JSON对象发送到名为api.example.com/frontdoor的端点。该对象看起来像这样:

{
  "visitor_id": "5d548e53-c351-4016-9078-b0a572df0bca",
  "name": "John Doe",
  "appointment": false,
  "purpose": "blahblahblah..."
}

该JSON对象由服务器使用,然后放入数据库中它们各自的表中。

同时,获取图像并将uuid作为文件名并发送给api.example.com/face,然后服务器对其进行处理,并以某种方式在正确的数据库条目行中添加指向该图像的链接。

问题是,我该怎么做到?我该如何关联将这两个发送到两个不同位置的数据?

最后,我计划有一个单独的终结点,例如api.example.com/visitors,它提供一个JSON对象,其中包含所有访问的列表,类似于:

{
  "visits": [
               {
                 "visitor_id": "5d548e53-c351-4016-9078-b0a572df0bca",
                 "name": "John Doe",
                 "appointment": false,
                 "purpose": "blahblahblah..."
                 "image": "imgbin.example.com/faces/c3118272-9e9d-4c54-8824-8cf4cfaa679f.png"
               },
               ... 
            ]
}

主要是,我正在努力使所有这些设计成为现实,以便我可以开始编写代码。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

据我了解,您的问题是关于在服务器端执行涉及两个不同子服务的操作-一个服务用于更新sql db中的文本数据,另一个服务用于存储图像,然后将图像的引用放回去到主要数据。我想到两种方法。

1)在客户端生成唯一的ID ,并将其与两个json对象上传和图像上传相关联。然后,当您上传图像时,图像上传服务可以使用此ID,在SQL中找到相应的记录并更新图像路径。但是,不建议使用生成客户端唯一ID的方法,因为可能会发生冲突,以至于多个客户端生成相同的ID会破坏逻辑。要解决此问题,在上传之前,客户端可以调用 ID生成服务,该服务将在服务器端唯一地生成ID,然后将其发送回客户端,然后客户端可以执行上传步骤使用相同的方法。这种方法的缺点是客户端需要对服务器进行额外的调用才能获得唯一的ID。这种方法的优势在于,如成功上传数据时,UI可以分别获取数据和图像的更新,可以说成功更新了数据,以及稍后在某个时间点上传图像时,那么可以说图像上传完成。因此,在这种情况下,可以不同地管理每个上载的响应。但是,如果数据和图像上载必须同时发生并且必须是原子的(如果数据或图像上载失败,则整个上载将失败),则无法使用此方法,因为服务器必须将这两个操作分组为交易

2)另一种方法是具有用于图像和数据上传的公共端点。图像和数据都在一次调用中一起上载到服务器,服务器首先生成一个唯一的ID,然后对数据上载服务和图像上载服务进行两次并行调用,而这两个子服务调用都将此唯一ID作为参数。如果两个上传都必须是原子上传,则服务器必须在事务中将这些子服务调用分组。关于返回的响应,它可以是同步或异步。如果需要保持UI等待上传成功,则响应将是同步的,服务器将必须等待这两个子服务完成才能返回响应。但是,如果不需要让UI处于等待状态,则服务器可以在调用这些子服务后立即响应,并显示一条消息,表明已接受上载请求。在这种情况下,子服务调用将被异步处理。

在我看来,方法2更好,因为那样服务器可以更好地控制相关动作的分组。关于响应,这取决于用例。如果用户关心他的帖子是否正确记录在服务器上(例如付款),那么最好实现同步。但是,如果用户启动该操作并离开(如生成报告或发送电子邮件的情况),则它可以具有异步实现。在服务器利用率方面,异步实现更好,因为服务器可以自由地接受其他请求,而不是等待子服务的操作完成。

这些是2种通用方法。我敢肯定,对于这个问题,将会有几种变体或完全不同的方法。

啊,答案太久了,希望对您有所帮助。让我知道是否有其他问题。