使用NSURLSession发出http DELETE请求

时间:2016-09-15 19:10:09

标签: ios objective-c ios9 nsurlsession

我尝试使用NSURLSession发出http DELETE请求,但它并没有完全正常工作。服务器删除资源,但NSURLSession方法dataTaskWithRequest:completionHandler:在等待指定的超时后返回超时错误。

我没有使用NSURLConnection,因为它已被弃用。

在要使用的NSURLSession方法中,我选择了dataTaskWithRequest,因为它与我用于http GET的方法最相似:dataTaskWithUrl:completionHandler。以" uploadTask"开头的方法和" downloadTask"似乎不适合DELETE,但是下载任务请求: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];
}

使用Postman,DELETE调用立即返回204。

我是否正确使用NSURLSession进行删除请求?

2 个答案:

答案 0 :(得分:1)

事实证明,Amazon API Gateway错误地发送了一个带有204响应的Content-Length标头。他们根据this AWS forum将问题添加到2016年3月21日的积压中。当我将NSMutableURLRequest的超时间隔增加到荒谬的300秒时,dataTaskWithRequest方法返回真实响应而不是超时。

答案 1 :(得分:0)

这不是NSURLSession的错误 - 这意味着您的请求实际上是超时的。这意味着后端有一个错误(可能根本没有到达你的服务器?)

此外,我发现使用第三方框架发送HTTP请求时,这些问题更容易调试。 AFNetworking非常好。