假设我们有'用户'资源,对'name'有唯一约束.您将如何设计REST API来处理find-or-create(按名称)用例?我看到以下选项:
客户:
POST /user
{"name":"bob"}
Run Code Online (Sandbox Code Playgroud)
服务器:
HTTP 409 //or something else
Run Code Online (Sandbox Code Playgroud)
客户:
GET /user?name=bob
Run Code Online (Sandbox Code Playgroud)
服务器:
HTTP 200 //returns existing user
Run Code Online (Sandbox Code Playgroud)
客户:
POST /user
{"name":"bob"}
Run Code Online (Sandbox Code Playgroud)
服务器:
HTTP 200 //returns existing user
Run Code Online (Sandbox Code Playgroud)
(如果实际创建了用户,则返回HTTP 201)
客户:
POST /user
{"name":"bob"}
Run Code Online (Sandbox Code Playgroud)
服务器:
HTTP 409 //as in option1, since no CREATE took place
{"id": 1, "name":"bob"} //existing user returned
Run Code Online (Sandbox Code Playgroud) 假设我有一个网站,其中包含一些可以从外部访问的信息.这些信息只需由受尊敬的客户进行更改.示例:Google Analytic或WordPress API密钥.如何创建一个像这样工作的系统(无论编程语言)?
我有List<Foo> getFoos ()从远程服务器获取数据并返回它的方法.
当然,用户不应该更改列表中的项目数量,因为他将获得与服务器上的数据不同步的数据(并且如果他想要更改他具有特殊方法的项目数量addFoo ()).
第一种方法是返回数组和更改方法的签名Foo[] getFoos ().但它在java中更常见,用户使用集合操作更方便,所以我将签名更改为List<Foo> getFoos ().此方法始终返回
Collections.unmodifiableList (originalList)
因此,当用户尝试更改列表时,他将获得RuntimeException.
在类似案例中是否有关于api设计的建议?
在实现具有分页参数的Rest API时,分页应该是零索引或从1开始.参数将是Page和PageSize.
对我来说,从1开始是有意义的,因为我们正在讨论页面
任何人都可以想到一个很好的解释,因为对话的结果是WPF中可以为空的bool吗?这一直困扰着我.在WinForms中它是一个枚举类型,这对我来说更有意义.
可能重复:
在C++中计算大因子
如何计算x的阶乘
如何在C++中实现阶乘函数?通过这个我的意思是使用任何参数检查正确实现它,并且错误处理逻辑适用于C++中的通用数学库.
我喜欢谷歌番石榴并且使用它很多,但有一种方法我总能找到我写的..
public static <T> T tryFind(Iterable<T> iterable, Predicate<T> predicate){
for(T t : iterable){
if(predicate.apply(t)){
return t;
}
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
对我来说,这似乎是一个非常有用的补充Iterables(也是Iterators为了那个问题),所以我想知道它为什么缺失.此外,虽然我可以看到有一个方法抛出的点NoSuchElementException,也许是为了区分找到一个null而没有找到该元素,但只有当你使用的谓词是
public boolean apply(T t){
return t==null;
}
Run Code Online (Sandbox Code Playgroud)
这似乎不是一个常见的情况.
那么为什么番石榴设计师选择了这种行为,而不是只是在找不到它时才返回null?
这是[Iterables.find()] [1]的javadoc
[1]:http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/Iterables.html#find (java.lang.Iterable,com.google.common.base.谓语)
重要的提示
这个问题的焦点在于API端点,它根据谁进行身份验证来区分返回哪些资源,例如Alice获得资源A和B返回,Bob获取资源X和Y.
它不是要区分返回的资源的表示.
所有端点都返回资源的JSON表示.
前言
请考虑以下三种潜在的API端点设计,即所有返回thing用户的资源.
终点A.
GET /things
Run Code Online (Sandbox Code Playgroud)
如果<user_x>请求提供了身份验证凭据,则会返回与其具体相关的thing资源.例如,验证用户Alice获得资源A和B返回,并且验证用户Bob获取资源X和Y.<user_x>
因此,不同验证用户的响应的区别在于返回哪些资源实例,而不是返回这些实例的哪些信息(即资源表示).
身份验证失败时,将返回401响应.
终点B.
GET /user/<user_x>/things
Run Code Online (Sandbox Code Playgroud)
终点C.
GET /things/?user_id=<user_x>
Run Code Online (Sandbox Code Playgroud)
如果验证用户有权访问这些资源,端点B和C都提供thing与之相关的资源实例.<user_x>thing
thing返回的资源实例的表示(例如,返回关于资源的哪些信息)可以根据哪个用户进行认证而变化.例如,<user_x>或者管理员用户可能会获得每个资源实例更丰富的数据,然后获得具有有限访问权限的用户.
验证对thing资源没有任何访问权限的用户<user_x>将获得401响应.
我的问题
我想回答以下问题:
1)端点是RESTful吗?
2)端点A是否具有良好的URI设计?
3)端点B和C是否RESTful?
4)端点B和C是否具有良好的URI设计?
我很期待你的回答.我也在下面提供了自己的答案,并对此也提供反馈表示感谢.
谢谢!
- 弗雷迪斯奈德
我有一个复杂的查询,它连接三个表并返回一组行,每行都有来自它的同级表的数据。如何以 RESTful 方式表示这一点?
FWIW 我知道不一定有“正确”的方法来做到这一点,但我有兴趣了解什么可能是这种情况下最可扩展和最持久的解决方案。
在过去,我代表了或多或少反映了 url 字面结构的单个表。例如,该 urlGET /agents/1/policies将导致类似select * from policies where agent_id = 1.
似乎 url 不一定必须与数据库层的结构如此紧密地耦合。例如,如果复杂查询类似于:
select
agent.name as agent_name,
policy.status as policy_status,
vehicle.year as vehicle_year
from
policies as policy
join agents as agent on policy.agent_id = agent.id
join vehicles as vehicle on vehicle.policy_id = policy.id
where 1=1
and policy.status = 'active';
# outputs something like:
{ "agent_name": "steve", "policy_status": "single", "vehicle_year": "1999" }
Run Code Online (Sandbox Code Playgroud)
我可以将此 QUERY 表示为 url 而不是 …
我正在设计一个RESTful API,它将始终通过HTTPS进行通信.有没有理由在通过HTTPS运行时使用像OAuth这样的方案?当整个通信被加密时,我特别感兴趣的是HMAC签名请求,随机数和时间戳等方面是否有用.
似乎任何基于HTTPS的身份验证方案都足够了,但我只想获得第二意见.
api-design ×10
rest ×4
.net ×1
algorithm ×1
api ×1
c++ ×1
collections ×1
dialogresult ×1
guava ×1
http ×1
https ×1
java ×1
oauth ×1
oop ×1
restful-url ×1
sql ×1
sql-server ×1
uri ×1
wpf ×1