2016-09-15 5 views
0

Я пытаюсь сделать запрос http DELETE с использованием NSURLSession, но он не работает полностью. Сервер удаляет ресурс, но метод NSURLSession dataTaskWithRequest: completeHandler: возвращает ошибку тайм-аута после ожидания указанного таймаута.Сделать запрос http DELETE с NSURLSession

Я не использую NSURLConnection, потому что он устарел.

Из методов NSURLSession, которые я использую, я выбрал dataTaskWithRequest, потому что он наиболее похож на метод, который я использую для http GET: dataTaskWithUrl: completeHandler. Методы, начинающиеся с «uploadTask» и «downloadTask», не кажутся подходящими для DELETE, но downloadTaskWithRequest: completeHandler: «работал» так же, как и метод dataTask выше. Сервер удалил ресурс, но метод вернул ошибку тайм-аута.

Вот код:

+(void)httpDelete: (NSString*)url completionHandler: (void(^)(id, NSError*))complete 
{ 
    NSURLSessionConfiguration *urlSessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; 

    NSMutableDictionary* dictionaryAdditionalHeaders = [[NSMutableDictionary alloc] init]; 

    NSString* stringBearerToken = @"..."; 
    NSString* stringApiKey = @"..."; 

    [dictionaryAdditionalHeaders setObject:stringBearerToken forKey:@"Authorization"]; 
    [dictionaryAdditionalHeaders setObject:stringApiKey forKey:@"x-api-key"]; 
    [dictionaryAdditionalHeaders setObject:@"application/json" forKey:@"Content-Type"]; 
    [dictionaryAdditionalHeaders setObject:@0 forKey:@"Content-Length"]; 

    [urlSessionConfiguration setHTTPAdditionalHeaders: dictionaryAdditionalHeaders]; 

    NSURLSession *urlSession = [NSURLSession sessionWithConfiguration: urlSessionConfiguration delegate:nil delegateQueue:[NSOperationQueue mainQueue]]; 

    NSMutableURLRequest* mutableUrlRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5]; 
    [mutableUrlRequest setHTTPMethod: @"DELETE"]; 

    [[urlSession dataTaskWithRequest:mutableUrlRequest completionHandler: ^(NSData *data, NSURLResponse* response, NSError* error) 
    { 
     if(error != nil) 
     { 
      complete(response, error); 
     } 
     else 
     { 
      complete(response, nil); 
     } 
    }] resume]; 
} 

Использование Почтальон, на DELETE возвращает вызов с 204 немедленно.

Я правильно использую NSURLSession для запроса на удаление?

+0

Ошибка тайм-аута - это проблема с базой данных. Если вы не получите ответ или не попадете в блок отказов, мы никогда не будем там, где проблема! –

ответ

0

Оказывается, API-интерфейс Amazon API неправильно отправляет заголовок Content-Length с ответом 204. Они добавили проблему в их отставание 21 марта 2016 года в соответствии с this AWS forum. Когда я увеличил интервал тайм-аута NSMutableURLRequest до смешного 300 секунд, метод dataTaskWithRequest вернется с реальным ответом вместо тайм-аута.

0

Это не ошибка с NSURLSession - это означает, что ваш запрос на самом деле отключен. Это значит, что в базе данных есть ошибка (может быть, она вообще не доходит до вашего сервера?)

Кроме того, я обнаружил, что эти проблемы намного проще отлаживать с помощью сторонней структуры для отправки моих HTTP-запросов. AFNetworking действительно хороший.

+0

Запрос поступает на сервер, и сервер удаляет ресурс. – crisphoney

 Смежные вопросы

  • Нет связанных вопросов^_^