Json 二进制数据的restapi设计

Json 二进制数据的restapi设计,json,api,rest,Json,Api,Rest,这感觉有点像是重新发明轮子,但我正在尝试为RESTAPI创建高级指导原则。例如,GET请求用于检索数据,POST请求用于创建对象或调用操作,补丁请求用于更新对象的部分,等等 我正在努力处理帖子部分。原因如下: 如果我不考虑二进制数据,我希望所有的POST请求体都是JSON。请看一个例子。我喜欢这一点,因为它更具表现力,并且易于在NoSQL数据库中转换 但我确实需要一些API操作来处理二进制数据。在这种情况下,我不确定JSON是否仍然有效 我的问题是: 在API设计中标准化POST请求有意义

这感觉有点像是重新发明轮子,但我正在尝试为RESTAPI创建高级指导原则。例如,GET请求用于检索数据,POST请求用于创建对象或调用操作,补丁请求用于更新对象的部分,等等

我正在努力处理帖子部分。原因如下:

    如果我不考虑二进制数据,我希望所有的POST请求体都是JSON。请看一个例子。我喜欢这一点,因为它更具表现力,并且易于在NoSQL数据库中转换
  • 但我确实需要一些API操作来处理二进制数据。在这种情况下,我不确定JSON是否仍然有效
我的问题是:

  • 在API设计中标准化POST请求有意义吗选项1:所有POST请求使用内容类型“application/x-www-form-urlencoded”或“multipart/form data”选项2:所有POST请求都使用内容类型“application/json”
  • 如果使用上面的选项2,如何允许客户端发送二进制文件数据
一个例子 为了澄清我的问题,让我们使用一个单一的<强> POST/Prime<强>操作。如果没有二进制数据,“application/json”主体可能如下所示

{
  firstName: "Yours",
  lastName: "Truly"
}
但是,如果用户需要包含二进制内容,“多部分/表单数据”主体将如下所示,请求中稍后会出现名为
photo
的输入的二进制内容

firstName=Yours
lastName=Truly

这里没有完美的解决方案——这是休息开始感到受限的地方之一。正如您所描述的,如果能够为所有请求标准化JSON,同时也能够为一些请求添加二进制输入,那就太好了。然而,为了将二进制输入与application/json输入一起传递,用户必须提交一个包含完整json部分和二进制部分的多部分请求,这比使用表单数据更麻烦

一个考虑因素是JSON是否会变得层次化——表单数据字段不能很好地扩展以表示更复杂的数据结构,因此对于这些数据结构,最好使用真正的应用程序/JSON部分,特别是当您试图与另一个不需要二进制输入的端点保持一致时


另一个需要考虑的问题是,您是否打算为客户提供母语SDK。这些SDK可以抽象出关于多部分表单请求的更为混乱和繁琐的细节,允许您保持一致性和灵活性,而不会出现太多可用性问题。

这里没有完美的解决方案——这是REST开始感到受限的地方之一。正如您所描述的,如果能够为所有请求标准化JSON,同时也能够为一些请求添加二进制输入,那就太好了。然而,为了将二进制输入与application/json输入一起传递,用户必须提交一个包含完整json部分和二进制部分的多部分请求,这比使用表单数据更麻烦

一个考虑因素是JSON是否会变得层次化——表单数据字段不能很好地扩展以表示更复杂的数据结构,因此对于这些数据结构,最好使用真正的应用程序/JSON部分,特别是当您试图与另一个不需要二进制输入的端点保持一致时


另一个需要考虑的问题是,您是否打算为客户提供母语SDK。这些SDK可以抽象出关于多部分表单请求的更为混乱和繁琐的细节,使您能够保持一致性和灵活性,而不会出现太多可用性问题。

为什么要以这种方式标准化POST请求?为每个POST请求使用最佳匹配的内容类型。@JohannesThorn这使开发人员能够专注于业务逻辑,而不需要考虑如何处理不同POST请求中的内容。它也更容易记录。例如,如果一个POST操作接受二进制数据,那么在存在二进制数据时使用“multipart/form data”和在没有二进制数据时使用“application/json”对我来说似乎很奇怪。不过,也有二进制内容媒体类型,例如音频/pcma。如果您有二进制数据,请使用其中一个,并使用一个能够充分描述请求内容的数据。您还可以为专有二进制格式定义特定于业务的媒体类型。@在这种情况下,客户端不需要发出两个请求吗?一个发送字段数据,另一个发送二进制数据?这里没有单一的答案。在某些情况下,使用多部分/表单数据将二进制blob放在单独的消息部分可能是有意义的,前提是资源仍然是单个可识别的实体。对Json对象中字段中的二进制数据进行编码也可能是有效的,特别是如果它很小的话。这在很大程度上取决于您的用例。如果你想提出一些一般性的、高层次的指导方针,那么唯一的答案就是“视情况而定”。你为什么要用这种方式来标准化你的发帖请求?为每个POST请求使用最佳匹配的内容类型。@JohannesThorn这使开发人员能够专注于业务逻辑,而不需要考虑如何处理不同POST请求中的内容。它也更容易记录。例如,如果一个POST操作接受二进制数据,那么在存在二进制数据时使用“multipart/form data”和在没有二进制数据时使用“application/json”对我来说似乎很奇怪。不过,也有二进制内容媒体类型,例如音频/pcma。如果您有二进制数据,请使用其中一个,并使用一个能够充分描述请求内容的数据。您还可以为专有二进制格式定义特定于业务的媒体类型。@在这种情况下,客户端不需要发出两个请求吗?一个发送字段数据,另一个发送二进制数据?这里没有单一的答案。在某些情况下,使用多部分/表单数据将二进制blob放入单独的消息部分可能是有意义的,