Разработка под iOS: почему я всегда получаю сообщение «Произошел сбой соединения» с первой попытки, но с успехом на следующей? - PullRequest
17 голосов
/ 21 мая 2011

Я использую библиотеку ASIHTTPRequest в своем приложении для 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. Ваши мысли?

Большое спасибо за вашу мудрость!

Ответы [ 4 ]

30 голосов
/ 23 мая 2011

В этом выпуске мне было очень трудно понять, почему.Проблема заключается в самом ASIHTTPRequest (iOS), а не в коде rails.

Короче говоря, проблема связана с использованием постоянного соединения для каждого запроса, отправляемого ASIHTTPRequest..

Хотя это хорошо для запросов GET, большинство реализаций сервера не позволяет использовать постоянное соединение с запросом POST.

У меня не было времени глубоко исследовать его на сервере.но я думаю, что проблема заключается в заголовке 100-Continue, который должен быть отправлен (а что нет) с запросом, к которому прикреплено тело (следовательно, PUT / POST).Если вы хотите глубже взглянуть на то, о чем я говорю, прочитайте спецификацию: http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html

Так что постоянное соединение, используемое ASIHTTPRequest, ожидает отправки ответа 100, чтоникогда не отправляется.так что время ожидания истекает.

Исправление - установить для persistentConnection значение NO с вашими запросами на публикацию, как показано ниже:

ASIHTTPRequest *req                     = [ASIHTTPRequest requestWithURL:url];
req.shouldAttemptPersistentConnection   = NO;
1 голос
/ 18 декабря 2011

Сбой безопасного соединения

      An error occurred during a connection to login.yahoo.com.

SSL получил запись с неверным кодом аутентификации сообщения.

(Код ошибки: ssl_error_bad_mac_read)

Страница, которую вы пытаетесьпредставление не может быть показано, потому что подлинность полученных данных не может быть проверена.Пожалуйста, свяжитесь с владельцами веб-сайта, чтобы сообщить им об этой проблеме.В качестве альтернативы, используйте команду из меню справки, чтобы сообщить об этом сломанном сайте.

0 голосов
/ 12 сентября 2013

Я также должен был установить ответ setHeader Connection на «закрытие» сервлетом Java

response.setHeader("Connection", "close");
0 голосов
/ 14 июля 2012

В iOS 5.1 даже после обновления ASIHTTPRequest до ASIHTTPRequestVersion = @ "v1.8.1-61 2011-09-19" по-прежнему необходимо:

ASIHTTPRequest *req = [ASIHTTPRequest requestWithURL:url];
req.shouldAttemptPersistentConnection = NO;
...