是否可以根据GET请求参数更改响应?

时间:2019-02-26 17:52:19

标签: rest request api-design

一个端点的响应具有一组不同的字段是否正确?

例如:

有一个端点/orders,它返回有关订单的信息(假设-42个字段),并且该信息显示在用户的帐户网页上。

在某个时候,我们还有另一个网页需要(出于自身目的)有关用户尚未付款的订单的信息。该请求将是这样的-/orders?unpaid=True 在这种情况下,网页仅需要4个字段而不是42个字段。我应该只在响应中放入这四个字段,还是为任何目的保留一种响应格式会更好?

2 个答案:

答案 0 :(得分:1)

在大多数情况下,基于GET请求参数做出决定不是一个好主意。无需费力即可操纵GET参数。 话虽如此,有时我会使用GET参数来决定用户看到的内容,也就是我已经知道该特定事件的结果是什么。 例如,如果用户在登录时提供了无效的凭据,则我的后端已经知道该凭据无效。但可以说,我没有其他方法可以将错误消息传递给前端供用户显示。然后,我会做类似的事情:

https://example.com/login.php?failed_message=Failed!No user found!

我们在这里不做任何决定。我们只知道,如果login.php是使用GET参数调用的,则登录必须失败。因此,我们从后端重定向到该URL。

答案 1 :(得分:1)

目前尚无明确的准则来处理像您这样的案件,所有讨论似乎都带有偏见。

但是,您似乎打算使用查询参数unpaid来有选择地过滤掉所有已付款的订单,因此可以从某种意义上将其作为查询参数。

但另一方面,它会返回不同类型的响应-甚至可能是完整(已付费?)订单数据的子集。换句话说,如果您决定根据查询参数返回不同的数据类型,则会使您的API有点不清楚。

所以我建议采用以下方法:

/orders                       -- always data with 42 fields
/orderSummaries               -- always data with  4 fields
/orders?unpaid=True           -- always data with 42 fields
/orderSummaries?unpaid=True   -- always data with  4 fields

因此,让查询参数仅影响结果集的过滤和排序,而不影响返回的数据类型。