使用 NSURLSession 发出 http DELETE 请求
Make http DELETE request with NSURLSession
我正在尝试使用 NSURLSession 发出 http DELETE 请求,但它无法完全正常工作。服务器删除资源,但NSURLSession方法dataTaskWithRequest: completionHandler: returns等待指定超时后出现超时错误。
我没有使用 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 调用 returns 立即返回 204。
我是否正确使用 NSURLSession 来处理删除请求?
这不是 NSURLSession 的错误 - 这意味着您的请求实际上超时了。这意味着后端出现错误(也许它根本没有到达您的服务器?)
此外,我发现使用第三方框架发送我的 HTTP 请求更容易调试这些问题。 AFNetworking 真的很不错。
事实证明,Amazon API 网关错误地发送了带有 204 响应的 Content-Length header。根据 this AWS forum,他们于 2016 年 3 月 21 日将该问题添加到积压工作中。当我将 NSMutableURLRequest 的超时间隔增加到荒谬的 300 秒时,dataTaskWithRequest 方法 returns 有一个真正的响应而不是超时。
我正在尝试使用 NSURLSession 发出 http DELETE 请求,但它无法完全正常工作。服务器删除资源,但NSURLSession方法dataTaskWithRequest: completionHandler: returns等待指定超时后出现超时错误。
我没有使用 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 调用 returns 立即返回 204。
我是否正确使用 NSURLSession 来处理删除请求?
这不是 NSURLSession 的错误 - 这意味着您的请求实际上超时了。这意味着后端出现错误(也许它根本没有到达您的服务器?)
此外,我发现使用第三方框架发送我的 HTTP 请求更容易调试这些问题。 AFNetworking 真的很不错。
事实证明,Amazon API 网关错误地发送了带有 204 响应的 Content-Length header。根据 this AWS forum,他们于 2016 年 3 月 21 日将该问题添加到积压工作中。当我将 NSMutableURLRequest 的超时间隔增加到荒谬的 300 秒时,dataTaskWithRequest 方法 returns 有一个真正的响应而不是超时。