如何为 REST api 实现试运行选项,以便我知道它已实现?

Kil*_*vuz 5 validation rest restful-url

在我的系统中,我有多个服务为其资源公开 REST api。系统上的特定服务需要在特定情况下以空运行模式对其他服务进行休息调用,以进行验证。即使请求的主体具有对 api 有意义的有效负载,也不会保留任何内容,不会更改任何状态,也不会发送任何消息。棘手的部分是,如果此服务调用未实现试运行模式的 REST api,它将修改资源,而不仅仅是验证。仅当接收服务在其 api 中实现空运行时,我才需要一种方法来发出空运行请求,否则请求必须失败。

到目前为止,我有这些想法:

传递查询参数

我可以传递一个标志作为查询参数,但如果 api 不知道该参数,请求仍然会通过。

POST /resource?dry-run=true
Run Code Online (Sandbox Code Playgroud)

在标题中传递标志

与查询参数类似,未知头字段将被忽略。

公开试运行 api 仅用于验证

此解决方案有效,因为我可以验证 URL 的试运行版本是否存在,但我不想公开更多端点仅用于验证

POST /resource
POST /resource/dry-run

PUT /resource/{id}
PUT /resource/{id}/dry-run
Run Code Online (Sandbox Code Playgroud)

将标志注入资源体

这看起来是一个解决方案,但是当 api 不支持此字段时,JSON 序列化将失败。那种情况下,我不知道是因为api不支持dry-run还是body确实有问题。此外,感觉不对,因为试运行不是资源的一部分。

POST /resource

{
  "dry-run":true,
  ...
  ...
}
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来实现 REST api 的试运行功能,如果服务没有实现它,请求将失败?

小智 0

标头方式

对此似乎没有“正确”的答案。话虽这么说,我会采用标题方式。

您可以轻松阻止未知标头作为预检检查。您可以更改服务的标头允许列表,以阻止服务未使用的标头。

Access-Control-Allow-Headers: [<header-name>[, <header-name>]*]
Access-Control-Allow-Headers: *
Run Code Online (Sandbox Code Playgroud)

要查看您的服务允许的标头列表,请对其进行调用并检查响应标头并搜索Access-Control-Allow-Headers标头字段。

假设您有三个服务CatDogAnimalAnimal是调用Cat服务和Dog服务的调用者服务。

Dog -> Access-Control-Allow-Headers: [....,"X-Request-Dry-Run",..] // Dog 接受标头 Cat -> Access-Control-Allow-Headers: [.. ...] // cat 不接受“dry-run”标头

现在,当调用者调用CatX-Request-Dry-Run: true标头的服务时,它会收到请求错误。

MDN 参考:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers

比较

传递查询参数 可以传递一个标志作为查询参数,但如果 api 不知道该参数,请求仍然会通过。

在发布请求中混合发布正文和查询参数通常不是惯例。

公开空运行 api 只是为了验证 此解决方案有效,因为我可以验证 URL 的空运行版本是否存在,但我不想仅仅为了验证而公开更多端点

API 的路径存在冲突。

将标志注入资源主体 这看起来是一个解决方案,但是当 api 不支持该字段时,JSON 序列化将失败。这样的话,我也分不清到底是api不支持dry-run还是body本身有问题。此外,由于试运行不是资源的一部分,因此感觉不太对劲。

同意