Подтвердить что ты не робот

Разработка 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. Ваши мысли?

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

4b9b3361

Ответ 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");