Есть ли ограничение на размер документа для асинхронного запроса POST?

Я устанавливаю асинхронный почтовый запрос с документом, содержащим сотни точек местоположения. Я хочу сохранить этот документ в моем couchdb.

Для небольших документов ответ на запрос возвращается за очень короткое время, сохраняя документ. Когда размер документа немного увеличивается (по-прежнему <~ 200k), ответ занимает много времени, а затем возвращается с таймаутом. Я выставил таймаут на 120 секунд.

Мне не хватает какой-то настройки или есть ошибка кодирования?

- (void)post:(NSData*) requestBody {
    startTime = [NSDate date];
    NSURL* serverURL = [NSURL URLWithString: @"https://myUser:[email protected]/myDB"];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:serverURL];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPMethod:@"POST"];
    [request setTimeoutInterval:120.0];

    [request setHTTPBody:requestBody];


    [NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
    {
        if (response != nil) {
            if ([response respondsToSelector:@selector(statusCode)])
            {
                int statusCode = [((NSHTTPURLResponse *)response) statusCode];
                NSLog(@"StatusCode returned was %i", statusCode);
            }
            NSLog(@"Response: %@",response);
        }

         if ([data length] >0 && error == nil)
         {
             NSLog(@"data: %@", data);
             // DO YOUR WORK HERE

         }
         else if ([data length] == 0 && error == nil)
         {
             NSLog(@"Nothing was downloaded.");
         }
         else if (error != nil){
             NSLog(@"Error = %@", error);
         }

     }];

РЕДАКТИРОВАТЬ: проблема с тайм-аутом все еще остается. Я зарегистрировал прогресс в didSendBodyData: и узнал, что байты были отправлены. Не все, значит таймаут наступает. С curl загрузка работает нормально.

Кроме того, я обнаружил одну вещь в журнале: когда запрос был успешным, общее и ожидаемое количество байтов были одинаковыми:

Total Bytes written: 161120
Expected Bytes to write: 161120

When the request failed:
Total Bytes written: 163840
Expected Bytes to write: 166839

Есть другие идеи?

- (void)post:(NSData*) requestBody {
    NSURL* serverURL = [NSURL URLWithString: @"https://mySpace.cloudant.com/myDb"];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:serverURL
                                             cachePolicy:NSURLRequestUseProtocolCachePolicy
                                         timeoutInterval:30.0];
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:requestBody];

    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
    [connection start];
}

#pragma mark -
#pragma mark Connection Delegates
- (void) connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
    if ([challenge previousFailureCount] == 0) {
        NSLog(@"received authentication challenge");
        NSURLCredential *newCredential = [NSURLCredential credentialWithUser:@"myUser"
                                                                    password:@"myPwd"
                                                                 persistence:NSURLCredentialPersistenceForSession];
        NSLog(@"credential created");
        [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge];
        NSLog(@"responded to authentication challenge");
    }
    else {
        NSLog(@"previous authentication failure");
    }
}

person wassx    schedule 05.10.2013    source источник
comment
Скорее проверяйте конфигурацию вашего сервера, чем iOS. Если есть ограничение, оно устанавливается на стороне сервера.   -  person Grzegorz Krukowski    schedule 06.10.2013
comment
Это может быть вызвано несколькими причинами. Я сомневаюсь, что вы достигли каких-либо ограничений на размер запроса (я думаю, что максимальный размер документа в Cloudant составляет примерно 64 МБ). Моим первым шагом было бы посмотреть, сможете ли вы воспроизвести проблему, например, завиток. Если у вас все еще есть тайм-аут, напишите по адресу [email protected], и мы решим проблему с вами.   -  person Will Holley    schedule 06.10.2013


Ответы (1)


Похоже, это проблема с форматом URL. При использовании низкоуровневой библиотеки HTTP вам необходимо вручную добавить заголовок базовой аутентификации - NSURLConnection и Basic HTTP-аутентификация в iOS показывает, как это сделать. Таким образом, тайм-аут, вероятно, связан с попыткой устройства связаться с недопустимым хостом.

Вы можете проверить это, попытавшись сделать запрос напрямую с помощью curl, то есть:

curl -XPOST https://[email protected]/db -H 'Content-Type:application/json' -d @test.json

где test.json содержит JSON, время ожидания которого истекло.

Использование curl упрощает отладку (вы увидите необработанный ответ), а также подтверждает, является ли это проблемой на стороне сервера или какой-то конкретной библиотекой.

person Will Holley    schedule 08.10.2013