【问题标题】:Make http DELETE request with NSURLSession使用 NSURLSession 发出 http DELETE 请求
【发布时间】:2017-01-23 22:11:07
【问题描述】:

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

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

在要使用的 NSURLSession 方法中,我选择了 dataTaskWithRequest,因为它与我用于 http GET 的方法最相似:dataTaskWithUrl:completionHandler。以 "uploadTask" 和 "downloadTask" 开头的方法似乎不适合 DELETE,但 downloadTaskWithRequest: completionHandler: 'worked' 的方式与上面的 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 来处理删除请求?

【问题讨论】:

  • 超时错误是后端问题。除非您得到响应或遇到故障块,否则我们永远不会出问题!

标签: ios objective-c ios9 nsurlsession


【解决方案1】:

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

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

【讨论】:

  • 请求到达服务器,服务器删除资源。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多