Разработка iOS: Почему я всегда получаю "Ошибка соединения" при первой попытке, но успех в следующем?
Я использую ASIHTTPRequest lib в своем приложении iOS, чтобы отправлять запросы RESTful в мое веб-приложение Rails 3. Я вижу странную и несколько непротиворечивую ошибку в первый раз, когда я пытаюсь сделать запрос POST для своего веб-приложения, но затем запрос POST отлично работает во второй попытке. Точная ошибка...
Error Domain=ASIHTTPRequestErrorDomain Code=1 "A connection failure occurred" UserInfo=0xb513740 {NSUnderlyingError=0xb5135a0 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1005.)", NSLocalizedDescription=A connection failure occurred}
И вот мой код ASIHTTPRequest для создания запроса POST...
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://myrails3app.heroku.com/tournaments/%d/register.json", tid]];
__block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setRequestMethod:@"POST"];
[request addPostValue:username forKey:@"username"];
[request setCompletionBlock:^
{
NSData *responseData = [request responseData];
NSLog(@"Success!");
}];
// Set the code to be called when the request fails
[request setFailedBlock:^
{
NSError *error = [request error];
NSLog(@"Error: %@", [error localizedDescription]);
}];
// Start the request
[request startAsynchronous];
Стоит упомянуть, что, когда он ошибается, он быстро вылетает из строя! Кроме того, для того, что стоит, мое приложение Rail 3, которое я делаю POST-запрос, размещено на Heroku. Ваши мысли?
Большое спасибо за вашу мудрость!
Ответы
Ответ 1
В этой проблеме мне было очень трудно понять, почему. Проблема заключается в самом ASIHTTPRequest (iOS), а не в коде rails.
Короче говоря, проблема связана с использованием постоянного соединения для каждого запроса, отправленного ASIHTTPRequest.
Хотя это хорошо для запросов GET, большая часть реализации сервера не позволяет использовать постоянное соединение с запросом POST.
У меня на самом деле не было времени, чтобы исследовать его на стороне сервера, но я думаю, что проблема связана с заголовком 100-Continue, который должен быть отправлен (а какой нет) с запросом, который прикреплен к телу к нему (следовательно, PUT/POST). Если вы хотите глубже взглянуть на то, о чем я говорю, обратитесь к спецификации: http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html
Таким образом, постоянное соединение, используемое ASIHTTPRequest, ожидает отправки 100 ответов, которые никогда не отправляются. поэтому он заканчивается истечением срока.
Исправление состоит в том, чтобы установить persistentConnection в НЕТ с вашими пост-сообщениями, как показано ниже:
ASIHTTPRequest *req = [ASIHTTPRequest requestWithURL:url];
req.shouldAttemptPersistentConnection = NO;
Ответ 2
Сбой безопасного соединения
An error occurred during a connection to login.yahoo.com.
SSL получил запись с неправильным кодом аутентификации сообщения.
(Код ошибки: ssl_error_bad_mac_read)
Страница, которую вы пытаетесь просмотреть, не может быть показана, поскольку аутентификация полученных данных не может быть проверена. Пожалуйста, свяжитесь с владельцами веб-сайтов, чтобы сообщить им об этой проблеме. Кроме того, используйте команду, найденную в меню справки, чтобы сообщить об этом сломанном сайте.
Ответ 3
На iOS 5.1 даже после обновления ASIHTTPRequest
до ASIHTTPRequestVersion
= @ "v1.8.1-61 2011-09-19" все еще необходимо:
ASIHTTPRequest *req = [ASIHTTPRequest requestWithURL:url];
req.shouldAttemptPersistentConnection = NO;
Ответ 4
Мне также пришлось установить ответ setHeader Connection на "закрыть" с помощью сервлета Java
response.setHeader("Connection", "close");