首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >长时间运行的REST API

长时间运行的REST API
EN

Stack Overflow用户
提问于 2013-05-10 04:11:30
回答 3查看 1.3K关注 0票数 2

我需要连接的后端API大约需要3-4分钟才能返回响应。iOS客户端似乎恰好在60秒(默认情况下)超时,我不知道如何延长超时时间。

我尝试将NSURLRequest的timeoutInterval设置为一个大数字,并设置了Connection: Keep-Alive头,但我没有运气。以下是我使用的代码,省略了一些API细节:

代码语言:javascript
复制
NSURL *url = [NSURL URLWithString:@"myAPI"];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

[request setHTTPMethod:@"POST"];

NSString *postString = @"key1=val1&key2=val2...";
[request setHTTPBody:[postString dataUsingEncoding:NSUTF8StringEncoding]];

request.timeoutInterval = 600.0f;

[request setValue:@"Keep-Alive" forHTTPHeaderField:@"Connection"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
     NSLog(@"data = %@", data);
}];

即使后端API仍在处理请求,也不会返回任何数据,所有响应头部字段都为空。

我听说我可能需要设置一个称为"socketTimout“的间隔,以便套接字知道让连接保持更长时间,但我不知道该在哪里设置。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-10 04:47:51

与其试图延长超时时间,不如稍微修改一下您的服务器架构。让服务器在获得所有数据后立即返回200OK,然后在后台队列中完成处理。创建另一个可用于检索数据的应用程序接口调用,并让iOS应用程序定期检查数据是否已被处理。或者,使用推送通知让用户/电话知道数据何时完成处理。

如果您碰巧使用的是Ruby on Rails,那么将长时间运行的进程设置为在工作线程上运行是非常容易的。看一看delayed_job的宝石。

如果由于某种原因您无法修改服务器的操作方式,请尝试确保您正在使用的API本身没有超时设置。我想不出iOS会忽略您设置的timeoutInterval的原因,除非该属性是只读的。请尝试使用此init方法:

代码语言:javascript
复制
- initWithURL:cachePolicy:timeoutInterval:
票数 6
EN

Stack Overflow用户

发布于 2013-05-10 04:31:55

您是否尝试过使用NSURLConnection委托方法而不是sendAsynchronousRequest

通过使用:

代码语言:javascript
复制
NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];
[connection start];

您可以监视委托方法didReceiveData,并将传入的数据附加到NSMutableData的实例:

代码语言:javascript
复制
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.data appendData:data];
}

这样,至少你会知道你正在接收数据,你甚至可以向你的用户显示一个进度条或其他东西。

票数 1
EN

Stack Overflow用户

发布于 2013-05-10 04:45:54

Erik,检查这个帖子上的答案:

NSURLConnection timeout?

实际上,您可以在NSURLRequest上使用此方法

requestWithURL:cachePolicy:timeoutInterval:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16470290

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档