2016-09-15 15 views
0

Ich versuche, eine http DELETE Anfrage mit NSURLSession, aber es funktioniert nicht vollständig. Der Server löscht die Ressource, aber die NSURLSession-Methode dataTaskWithRequest: completionHandler: gibt einen Zeitüberschreitungsfehler zurück, nachdem auf das angegebene Zeitlimit gewartet wurde.Machen http http DELETE Anfrage mit NSURLSession

Ich benutze NSURLConnection nicht, weil es veraltet ist.

Von den zu verwendenden NSURLSession-Methoden habe ich dataTaskWithRequest gewählt, weil es der Methode, die ich für http GET verwende: dataTaskWithUrl: completionHandler, am ähnlichsten ist. Die Methoden, die mit "uploadTask" und "downloadTask" beginnen, scheinen für DELETE nicht geeignet zu sein, aber downloadTaskWithRequest: completionHandler: funktionierte auf die gleiche Weise wie die obige dataTask-Methode. Der Server hat die Ressource gelöscht, die Methode hat jedoch einen Zeitüberschreitungsfehler zurückgegeben. Hier

ist der Code:

+(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]; 
} 

Mit Postman, die DELETE-Aufruf kehrt mit einem 204 sofort.

Benutzt ich NSURLSession korrekt für eine Löschanforderung?

+0

Timeout-Fehler ist ein Back-End-Problem. Wenn Sie keine Antwort erhalten oder den Fehlerblock nicht drücken, ist das Problem nie da! –

Antwort

0

Es stellt sich heraus, dass das Amazon API Gateway einen Content-Length-Header mit einer 204-Antwort falsch sendet. Sie haben das Problem zu ihrem Rückstand 21. März 2016 nach this AWS forum hinzugefügt. Wenn ich das Timeout-Intervall von NSMutableURLRequest auf lächerliche 300 Sekunden erhöhte, wird die dataTaskWithRequest-Methode mit einer echten Antwort zurückgegeben, anstatt das Zeitlimit zu überschreiten.

0

Dies ist kein Fehler mit NSURLSession - es bedeutet, dass Ihre Anfrage tatsächlich Zeitlimit ist. Das bedeutet, dass es einen Fehler im Backend gibt (vielleicht erreicht es überhaupt Ihren Server nicht?)

Außerdem habe ich festgestellt, dass diese Probleme mit einem Framework von Drittanbietern viel einfacher zu debuggen, um meine HTTP-Anfragen zu senden. ist ein wirklich guter.

+0

Die Anforderung erreicht den Server und der Server löscht die Ressource. – crisphoney