休息非CRUD搜索

时间:2016-10-19 17:43:03

标签: java rest

我在REST WS中遇到GET操作问题。我们有一个前端面板,带有几个用于搜索客户的过滤器。该面板包含以下过滤器:

  • 客户ID(客户物业)
  • 客户名称(客户财产)
  • 帐号(帐户属性)
  • 车牌(车辆物业) ...

在域模型中,我们有3个实体:

  • 客户
  • 帐户(客户可以拥有一个或多个帐户)
  • 车辆(一个帐户可能有一辆或多辆车辆)

如何为此搜索实现REST GET操作?

GET .... / customers /?name = {name}& accountNum = {accountNumber}& licensePlate = {licensePlate} ?????

我认为这是错误的,因为accountNumber和licensePlate不属于客户资源。我不希望在预期的结果中使用这些属性。

我想创建像customerFilter这样的新资源,但是如果我必须返回客户资源则没有意义。

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

它不会假装是您问题的具体答案。但我认为这将澄清与GET方法相关的内容。

根据URI Specification - RFC 3986Http Specification - RFC 7230,有三种方法可以将数据从客户端发送到服务器:通过查询,通过路径或通过 message-body

当您使用GET方法时,不建议使用message-body,因为可以缓存GET方法以改进性能内容,这些缓存可以忽略消息体或拒绝请求:

  

GET请求消息中的有效负载没有定义的语义;      在GET请求上发送有效负载主体可能会导致一些存在      拒绝请求的实现。

因此,您现在可以选择查询路径。两者都采用以下格式的URL:

http://example.com/{path1}/{path2}?query1=value1&query2=value2

这些之间有什么区别?根据{{​​3}}和RFC 3986 - Path

  

路径组件包含通常以分层结构组织的数据      表单,以及非分层查询组件中的数据      (第3.4节),用于识别范围内的资源      URI的方案和命名权限(如果有的话)。

     

查询组件包含非分层数据      路径组件中的数据(第3.3节)用于识别a      URI的方案和命名权限范围内的资源      (如果有的话)。

作为结论,您可以设计任何您想要的东西。您可以使用例如:

GET .../customers?name={name}&accountNum={accountNumber}&licensePlate={licensePlate}

GET .../customers/{customerId}/

GET .../customers?customerId=12345

答案 1 :(得分:0)

我没有看到您的网址有任何问题,但您的担忧也是有效的。

在这种情况下,我们需要考虑一些事项。通过此搜索,您希望获得API调用的响应?

如果您希望响应应该包含有关客户的信息,当搜索条件得到满足时, / customer 是正确的。

如果您想要一些由客户,帐户和车辆信息组成的通用响应,您可以在网址中使用一些通用术语而不是客户。

我希望这会对你有所帮助。 谢谢:))