异步无状态API

问题描述 投票:0回答:2

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

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

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

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

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

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

要求:

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

回答

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

在每个答案中包含每个请求参数对我来说看起来很奇怪,但这是我发现的创建一个准备好异步调用的无状态 API 的唯一解决方案。

还有其他方法可以实现这一点吗?

(我使用委托模式为每个请求分配一个对象,该对象在收到答案时调用。问题是,在食谱的示例中,每次列出食谱成分时都会重用成分表视图)。

ios objective-c rest stateless
2个回答
2
投票

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

另一种可能性是创建“可取消的异步请求”。当您发出请求时,返回一个可用于取消请求的对象。如果在委托被解雇之前取消请求,则确保委托不会被解雇。当收到已取消请求的响应时,只需将其丢弃即可。对于您的成分表,在发出新请求之前,您需要取消任何待处理的请求(以便您一次最多有一个未取消的请求)。

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.