当前位置: 首页 > 知识库问答 >
问题:

REST API:是否可以接受PUT到包含查询参数筛选器的资源?

叶元凯
2023-03-14
dev=# SELECT * FROM
        price
      WHERE
        product_id = 1 AND price_list_id = 1 AND currency_code = 'GBP';
 id |                 uuid                 | product_id | price_list_id | qty | currency_code | unit_price |          created           |          modified          
----+--------------------------------------+------------+---------------+-----+---------------+------------+----------------------------+----------------------------
  1 | 6fcbbb5b-8e51-4a4c-bf63-270f5d3f1ff8 |          1 |             1 |   1 | GBP           |      20417 | 2019-08-15 15:49:19.508808 | 2019-08-15 15:49:19.508808
 16 | c044e9fe-bb5f-4996-b8e6-88b4a1b9f125 |          1 |             1 |   2 | GBP           |    3453345 | 2019-08-15 15:49:37.896681 | 2019-08-15 15:49:37.896681
 17 | c488d372-e58f-4441-a583-281e4c2b1310 |          1 |             1 |   3 | GBP           |  312353345 | 2019-08-15 15:49:41.320622 | 2019-08-15 15:49:41.320622

[
  { id: "6fcbbb5b-8e51-4a4c-bf63-270f5d3f1ff8", "qty": 1, "unit_price": 20417 },

  ... etc  // 3 items total
]

如果我想更新给定的一组价格(PRODUCT_IDPrice List_IDCurrency_code),是否可以通过对我用于GET的同一URI执行PUT请求(即PUT/products/:PRODUCT_ID/prices/PRICE_List_ID=1&Currency_code=GBP)来执行完全相反的操作?

在具有price_list_id=1currency_code=GBPget请求的上下文中,类似于过滤器。在使用put请求时,我不确定是否可以使用查询参数作为筛选器来标识用于更新的资源。

我考虑过的备选方案有:

  1. 将/products/:product_id/prices放置在请求正文中,并将price_list_idcurrency_code放置在请求正文中。例如
{
  "price_list_id": "<uuid>",
  "currency_code": "GBP",
  "data": [
    { "qty": 1, "unit_price": <newprice> },
    ...  /* new set of prices */
  ]
}

从而删除所有现有价格,并用请求体中的价格替换该集合。

put/products/:product_id/prices/price-lists/:price_list_id开始看起来很冗长。产品有很多价格所以资源的第一部分看起来可以嵌套为子资源。但是,prices没有price-lists(正好相反),因此将price-lists作为价格的子资源是没有意义的。

put/prices/:price_id。这意味着我必须首先检索一个列表,一个一个地删除它们,并单独更新价格。这不是一个好的解决办法,因为我想把价格作为一个集合来操作。我也希望这套被替换为一个整体或根本没有。

共有1个答案

尹弘壮
2023-03-14

您发送PUT请求的url应该是您正在更新的东西的“标识”。因此,在请求体中包含用于定位资源的信息是没有意义的。

服务器“定位”正在更新的资源所需的所有信息都应该在资源定位器(即URL!)中

从HTTP协议的角度来看,所有这些都是完全没有问题的:

    null
 类似资料:
  • 问题内容: 我们正在使用加载属性信息。我们的属性文件已经变得非常庞大,我们正在考虑将主属性文件分成几个子模块。有可能实现这一目标吗? 让我知道? 问题答案: 首先,我想知道为什么您选择了。给出问题的表达方式后,您似乎不必关心本地化/国际化或捆绑文件继承。 有了它,它就变得异常容易,因为它实现了反过来又提供了一种合并另一张地图的方法。开球示例: 如果您真的坚持使用,则最好的选择是创建一个自定义,在该

  • 问题内容: 假设我在数据库中有一个表“ student”,它很大。学生中有几列,包括“ id”和“ class-id”。 在hbm文件中,我目前具有以下防御者代码: 在这种情况下,如果我更新学生持久性课程,则查询将类似于: 但是出于分区的原因,我还想在查询中包括class-id,例如: 我尝试了Composite-ID,但是发现Composite-ID中不允许使用生成器,因为Composite-I

  • 我看不到任何关于何时应该使用查询或过滤器或两者结合的描述。他们之间有什么区别?谁能解释一下吗?

  • 问题内容: 给定一个整数,如何使用Java检查它是否包含0? 如何才能做到这一点? 问题答案: 您是说小数表示形式是否包含0?绝对 最简单的 方法是: 别忘了一个数字并不“固有地”包含一个0或不包含0(当然,零本身除外)-它取决于底数。因此,十进制的“ 10”是十六进制的“ A”,而十六进制的“ 10”是十进制的“ 16”……在两种情况下,结果都会改变。 在整数的十进制表示形式中,可能有更有效的方

  • 问题内容: 当使用SQL Object参数绑定时,JDBI是否可以与UUID参数一起使用? 我有这样的方法: 绑定到接收如下参数的SQL Server存储过程: 执行时,将抛出此异常: 如果我将JDBI上的参数类型更改为String,然后使用UUID对象中的toString()方法调用它,则它将起作用: 有没有办法编写我的DAO方法来接受UUID参数,并在绑定之前将它们转换为字符串? 问题答案:

  • valgrind快速启动页面提到: 这将我引向这样一个问题:是否有充分的理由不在生产中从程序中消除这样的错误?发布包含此类错误的程序有什么好处吗?如果有,开发人员如何保护它的安全,尽管据我所知,包含此类错误的程序可以不可预测地运行,并且无法对其行为做出一般假设?如果是这样,你能提供真实世界的例子,说明程序运行时有这些错误比没有错误更好吗?