0

我正在开发一个部署系统,该系统需要在池中的所有或部分机器上的池中部署一些应用程序。为了简单起见,假设我对 api 只有 3 个要求。

  1. 部署
  2. 取消
  3. 地位

我现在对为上述操作设计 REST api 调用感到困惑:这是我的想法。如果有效负载为空,我将部署在池中的所有机器上。

http://my-endpoint/api/{pool-name}/deploy

Payload:
{
    "machines" : [
        "machine-1.fqdn",
        "machine-2.fqdn",
        "machine-3.fqdn"
    ]
}
Response:
{
    "status": "OK",
    "jobId": "9999"
}

然后,客户端可以根据 jobId 轮询状态或取消部署:

http://my-endpoint/api/{pool-name}/status/{jobId}
http://my-endpoint/api/{pool-name}/cancel/{jobId}

现在,jobId 在整个部署系统中是唯一的,因此在 api 中使用 {pool-name} 表示“状态”和“取消”似乎并不正确。这是一个好的设计吗?我在网上阅读了许多关于 REST 中映射操作的文章,它们只会增加我的困惑。我的应用程序中没有任何 CRUD。我只是想确保我以正确的方式做这件事。有人可以指出设计中的缺陷吗?任何指针都会有所帮助。

4

2 回答 2

2

几个想法:

首先,您的回答不允许某些机器工作而某些机器不工作的可能性。因此,您的响应可能需要是一个数组,每个尝试的机器都有一个状态。

其次,这不是严格意义上的宁静,您正在创建有效的动词 URL。实用上它会起作用,但要成为 RESTful,您应该识别您的实体并使用 GET、PUT、POST 和 DELETE。

所以在这里你的实体可能只是工作。

PUT to /myendpoint/api/job

带有包含池名称和机器数组的有效负载。响应将是一组状态和作业 ID。

[ 
{
"status": "OK",
"jobId": "m1-9999"
},{
"status": "OK",
"jobId": "m2-9999"
},{
"status": "BAD",
"machine": "m3"
"reason": "xxx"
}
]

您在工作 ID 上获取 GET 以获取状态。jobid 足以识别它在哪台机器上。

GET myendpoint/api/job/m2-9999

并 POST 到具有“取消”有效负载的相同 URL 以取消作业。

于 2013-10-06T07:20:04.977 回答
0

对于取消和状态,我实际上更喜欢以下

http://my-endpoint/api/{pool-name}/cancel/{job-id}

我的设计是不对空请求有效负载采取任何行动。这是为了防止非严肃用户不必要地攻击 API。我希望有一个有效负载,否则会向他们抛出一个错误响应。

再次成功取消/状态,会发回一个响应,如

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<request-result>
<http-code>200</http-code>
<description>REST Request is successfully processed</description>
<internal-error-info></internal-error-info>
<message>Job with {id} is processed successfully</message>
<requested-operation>Cancel</requested-operation>
<resource-name>JobName</resource-name>
<status>SUCCESSFUL</status>
</request-result>
于 2014-06-04T00:43:45.887 回答