将多个REST API请求合并到一个请求中?

Mar*_*ijn 5 api rest latency

我正在为我的应用程序开发REST API.

有了这个API,我可以做的东西一样更新使用PUT一个公司或个人的详细信息companies/1和PUT persons/2,families/3,等等.

我想使用此API与其他应用程序进行常规同步.这将涉及数以十万计的REST API请求,其中大多数是此类更新.每个请求只需要很少的时间,但每个请求的延迟会占用相当多的时间.

有没有什么方法可以创建REST API,它可以将多个请求合并为一次.我可以很容易地想到使用一系列路径和formdata来做一个PUT,但似乎有人应该已经设计了一个更好的解决方案.

是否有最佳实践将多个不同的请求组合到一个REST API中以避免延迟,或者是否有更好的方法来处理这样的情况?

Sco*_*pey 6

Google 的 Gmail API 支持这一点,它有一个非常可靠、可重用的 API。

https://developers.google.com/gmail/api/guides/batch

长话短说,您的 API 有一个POST /batch端点,在请求正文中,您发送多个 HTTP 请求。响应将被类似地编码。
这需要服务器端和客户端逻辑,但非常通用且可重用。

例子:

POST /batch HTTP/1.1
Content-Type: multipart/mixed; boundary=batch_foobarbaz
Content-Length: total_content_length

--batch_foobarbaz
Content-Type: application/http

GET /farm/v1/animals/pony

--batch_foobarbaz
Content-Type: application/http

PUT /farm/v1/animals/sheep
Content-Type: application/json
Content-Length: part_content_length
If-Match: "etag/sheep"

{
  "animalName": "sheep",
  "animalAge": "5"
  "peltColor": "green",
}

--batch_foobarbaz
Content-Type: application/http

GET /farm/v1/animals
If-None-Match: "etag/animals"

--batch_foobarbaz--
Run Code Online (Sandbox Code Playgroud)


inf*_*rno 2

延迟只会随着一系列请求而增加。使用并行请求可以解决这个问题。

这里没有最佳实践。

  • 您可以将包含多个项目的 PATCH 发送到集合中。
    PATCH /companies [{id:1, ...}, {id: 2, ...}, ...]
  • 您可以定义一个复合集合,其中可以包含不同类型的项目。
    PATCH /resources [{id: 1, "rdf:type": "app:Company", ...}, {...}]

我不喜欢他们两个,但这只是一个意见......