异步无状态API

时间:2010-01-23 17:22:50

标签: iphone objective-c api rest stateless

想象一下列出一些食谱的表格视图。每次用户点击食谱时,都会加载一个列出食谱成分的新表视图。

要获取信息,我使用以下方法异步调用REST API:

NSURLRequest *request = [NSURLRequest requestWithURL:url
                                      cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
                                      timeoutInterval:30];

当用户点击食谱时,会调用API来获取食谱成分。但是,一旦进入新视图(列出成分)并且在收到答案之前,用户可以返回并选择新配方。

在这种情况下,我会回答两个答案;每个请求一个。问题是我不知道这个答案的要求是什么,我会用错误答案的错误内容刷新UI。

我不确定在这种情况下哪种方法是正确的。我正在考虑在每个请求参数的答案中包含。所以,如果我是,例如,使用API​​搜索某个术语,我们说“foo”,我也会在答案中包含该术语,例如:

请求

http://domain.com/api/search?term=foo

答案

{
"requestType": "search",
"term": "foo",
"result" : "a foo result"
}

在每个答案中包含每个请求参数对我来说很奇怪,但它是我发现创建无状态API的唯一解决方案,可以称之为异步。

¿有没有其他方法可以实现这个目标?

(我正在使用委托模式为每个请求分配一个对象,当收到答案时调用该请求。问题是,在配方示例中,成分表视图被重用,并列出了eache time recipe ingredientes)

2 个答案:

答案 0 :(得分:2)

一种可能性是在请求中包含唯一的“请求ID”,并使服务器回显它。然后服务器不需要返回所有请求参数,只需要返回请求ID。客户端会为每个请求生成一个新的ID,可能使用像递增整数这样简单的东西。

另一种可能性是创建“可取消的异步请求”。发出请求时,返回可用于取消请求的对象。如果在触发委托之前取消请求,则确保不会触发委托。当针对取消的请求回复时,请将其丢弃。对于您的成分表,在您发出新请求之前,您取消任何待处理的请求(这样您一次最多只有一个未取消的请求)。

实现此目的的一种方法是构建一个两阶段回调。由基础架构管理的第一个回调只是检查请求是否被取消。如果没有,它继续调用第二个回调(实际上是你的委托)。

答案 1 :(得分:0)

这里的一种典型方法是为每个食谱分配一个唯一值(“关键”值)并将其发送回响应,就像您提出的那样。如果配方名称是唯一且短的,则键值可以是配方名称,但更常见的策略是仅使用对用户无意义的唯一数字或其他值,但即使(对于),也可用于唯一地识别配方。例子)名称改变。在数据库术语中,这是 business 键和代理键之间的区别。两者都是唯一标识符,但是商业密钥对用户具有意义(例如名称),而代理密钥则没有。我的建议是使用代理键,因为你可以缩短它,它永远不需要改变,因为用户不关心它。

请注意,如果您在任何Web服务调用中接受密钥作为参数,则必须对其进行验证(或者在考虑安全性时对其进行加密),因为您永远不知道客户端是否会篡改它。 / p>

顺便说一句,我在这里假设客户“知道”最近选择了哪个食谱,因此它可以忽略其他食谱的反应。