【发布时间】:2017-03-22 11:56:15
【问题描述】:
我有一个关系数据库,我通过 Web 服务从中检索数据。我定义的@GET 方法基于主键。 例如,对于具有主键 1 的 团队,我使用 @GET 请求 http://localhost:8080://teams/1 来获取与团队相关的数据:
{
“id” : “1”,
“name” : “Barcelona"
}
在实现我的网络应用程序时,我遇到了一个概念问题。由于我认为让最终用户看到主键 ID 不是一个好习惯,因此我保留了基于主键的请求,但是,我在我的数据库表中添加了一个名为 uri 的属性(对于巴塞罗那 uri 是 bar,依此类推)。我使用 uri 属性作为 url 中的参数。因此,如果用户点击巴塞罗那队图片,他将获得 url:http://localhost:9000/teams/bar 而不是 http://localhost:9000/teams/1,而在状态的内部实现中,我正在使用我已经在我的 web 服务中定义的请求 http://localhost:8080://teams/1,因为此时我使用请求来获取巴塞罗那的图像,我也得到了可以作为参数传递给新请求的 id:http://localhost:9000/teams/1
一切正常,但问题是如果用户直接在浏览器中输入 url:http://localhost:9000/teams/bar 而不是点击巴塞罗那图像,请求将无法工作,因为 id 不是现在。
我想知道的是,在这种情况下,最佳做法是什么?
- 保持行为不变?
- 从数据库发出请求 基于uri属性而不是主键?如果是,我为什么要 使用主键?为什么不将 uri 属性视为主要属性 钥匙?
- 你有什么建议?
【问题讨论】:
-
最简单的解决方案是在您的数据库中为
uri字段创建一个索引,然后将您的Web 服务端点更改为查询uri,而不是id。 -
一般来说,我认为在 URL 中显示主键并没有什么害处,除非它本身具有某种意义(即银行帐号)。如果您担心未经授权的访问,您应该使用一些服务器端身份验证来验证是否允许用户查看与主键关联的结果。
-
好吧,假设您说服我将请求基于 uri 属性。那么,为什么我还需要 id 属性作为主键呢?我省略了 id 并使用 uri 属性作为主键(索引)?
-
@EddyG 将
uri-字段作为一个单独的字段,让您可以轻松更改它,因为您仍然使用id作为关系中的外键。跨度>
标签: angularjs web-services web jax-rs restful-url