ios - 使用 AFNetworking 的多部分 PUT 请求

标签 ios objective-c rest afnetworking afnetworking-2

在 iOS 上使用 AFNetworking 编写多部分 PUT 请求的正确方法是什么? (仍然是 Objective-C,不是 Swift)

我看起来好像 AFNetworking 可以执行多部分 POST 但不能执行 PUT,解决方案是什么?

谢谢

最佳答案

您可以使用 multipartFormRequestWithMethod 创建包含所需数据的多部分 PUT 请求。

例如,在 AFNetworking v3.x 中:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

NSError *error;
NSURLRequest *request = [manager.requestSerializer multipartFormRequestWithMethod:@"PUT" URLString:@"http://example.com/rest/api/" parameters:@{@"foo" : @"bar"} constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    NSString *value = @"qux";
    NSData *data = [value dataUsingEncoding:NSUTF8StringEncoding];
    [formData appendPartWithFormData:data name:@"baz"];
} error:&error];

NSURLSessionDataTask *task = [manager dataTaskWithRequest:request uploadProgress:nil downloadProgress:nil completionHandler:^(NSURLResponse * _Nonnull response, id  _Nullable responseObject, NSError * _Nullable error) {
    if (error) {
        NSLog(@"%@", error);
        return;
    }

    // if you want to know what the statusCode was

    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
        NSInteger statusCode = [(NSHTTPURLResponse *)response statusCode];
        NSLog(@"statusCode: %ld", statusCode);
    }

    NSLog(@"%@", responseObject);
}];
[task resume];

如果是 AFNetworking 2.x,你可以使用 AFHTTPRequestOperationManager:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

NSError *error;
NSURLRequest *request = [manager.requestSerializer multipartFormRequestWithMethod:@"PUT" URLString:@"http://example.com/rest/api/" parameters:@{@"foo" : @"bar"} constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    NSString *value = @"qux";
    NSData *data = [value dataUsingEncoding:NSUTF8StringEncoding];
    [formData appendPartWithFormData:data name:@"baz"];
} error:&error];

AFHTTPRequestOperation *operation = [manager HTTPRequestOperationWithRequest:request success:^(AFHTTPRequestOperation *operation, id responseObject) {
    NSLog(@"%@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"%@", error);
}];

[manager.operationQueue addOperation:operation];

在说明了如何创建这样的请求之后,值得注意的是服务器可能无法解析它们。值得注意的是,PHP 解析多部分 POST 请求,但不解析多部分 PUT 请求。

关于ios - 使用 AFNetworking 的多部分 PUT 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30387985/

相关文章:

c# - 对 ServiceStack 的 PUT/POST 请求挂起

iphone - UIActivityViewController 不解雇

objective-c - subview 和按钮

objective-c - 获取无错误的数值 "Subscript requires size of interface ' NSArray',这在非稳定 ABI 中不是常量”

iphone - CATransaction是立即的并且忽略过渡时间

django - 使用 django rest 框架代替 django orm 的最佳方式

ios - 如何在 didSelectRow 之后关闭 UISearchController?

ios - 如何处理依赖分析警告? iOS

ios - 如何在 POST 请求中附加数据 - Swift

php - Symfony 表单与 RESTful API 的序列化程序