2016-09-15 63 views
0

我試圖使用NSURLSession提出一個http DELETE請求,但它並不完全正常工作。服務器刪除資源,但NSURLSession方法dataTaskWithRequest:completionHandler:在等待指定的超時後返回超時錯誤。使用NSURLSession提出http DELETE請求

我不使用NSURLConnection,因爲它已被棄用。

在使用的NSURLSession方法中,我選擇了dataTaskWithRequest,因爲它與我用於http GET的方法最相似:dataTaskWithUrl:completionHandler。以「uploadTask」和「downloadTask」開頭的方法似乎不適用於DELETE,但downloadTaskWithRequest:completionHandler:'工作'的方式與上面的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]; 
} 

使用郵差,刪除調用返回立即以204。

我是否正確使用NSURLSession進行刪除請求?

+0

超時錯誤是一個後端問題。除非您得到迴應或者擊中失敗區塊,否則我們永遠不會遇到問題! –

回答

0

事實證明,亞馬遜API網關錯誤地發送了一個包含204響應的Content-Length標頭。根據this AWS forum,他們將問題添加到2016年3月21日的待辦事項中。當我將NSMutableURLRequest的超時間隔增加到荒謬的300秒時,dataTaskWithRequest方法返回一個真實響應,而不是超時。

0

這不是NSURLSession的錯誤 - 這意味着您的請求實際上超時。這意味着後端存在錯誤(可能根本沒有到達服務器?)

此外,我發現使用第三方框架發送我的HTTP請求更容易進行調試。 AFNetworking是一個非常好的。

+0

請求到達服務器,服務器刪除資源。 – crisphoney