如何使用 AFNetworking 为“PUT”请求设置数据?
Posted
技术标签:
【中文标题】如何使用 AFNetworking 为“PUT”请求设置数据?【英文标题】:How do I set the data for a "PUT" request with AFNetworking? 【发布时间】:2012-01-25 13:32:01 【问题描述】:我已经开始使用 AFNetworking,它在制作简单的“GET”请求时效果很好。但是现在我正在尝试执行“POST”请求。我使用下面的代码来执行“GET”请求。查看 AFHTTPClient 的 puthPath 时,无法设置要用于正文的数据。我的猜测是还有另一种方法可以解决这个问题。我一直在查看 AFHTTPOperation 作为解决此问题的方法。但是我没有让这个工作。问题是我不知道如何将它与基本身份验证一起使用。
有人可以告诉我如何使用 AFNetworking 进行简单的“POST”请求吗?
AFHTTPClient* client = [AFHTTPClient clientWithBaseURL:ServerURL];
[client setAuthorizationHeaderWithUsername:self.username
password:self.password];
NSString* resourcePath = [NSString stringWithFormat:@"/some/resource/%@",
endPath];
[client getPath:resourcePath
parameters:nil
success:^(AFHTTPRequestOperation *operation, id responseObject)
// Success code omitted
failure:^(AFHTTPRequestOperation *operation, NSError *error)
// Some error handling code omitted
];
【问题讨论】:
由于声誉低下,我无法回答我自己的问题。因此,我发布此评论。当我有可能这样做时,我会将其发布为答案。如果没有找到任何简单的方法来使用code
AFHTTPClientcode
来解决这个问题。但是,我确实为code
AFHTTPClientcode
创建了一个子类,这实际上是在 AFNetworking 文档中推荐的。
【参考方案1】:
我没有找到任何简单的方法来做到这一点。但我按照建议做了,并创建了自己的 AFHTTPClient 子类。在子类中,我实现了以下方法。这使得使用我自己的数据执行 POST 请求和 PUT 请求成为可能。
- (void)postPath:(NSString *)path
parameters:(NSDictionary *)parameters
data:(NSData*)data
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;
NSURLRequest *request = [self requestWithMethod:@"POST" path:path parameters:parameters data:data];
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];
[self enqueueHTTPRequestOperation:operation];
- (void)putPath:(NSString *)path
parameters:(NSDictionary *)parameters
data:(NSData*)data
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;
NSURLRequest *request = [self requestWithMethod:@"PUT" path:path parameters:parameters data:data];
AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];
[self enqueueHTTPRequestOperation:operation];
-(NSMutableURLRequest*)requestWithMethod:(NSString *)method
path:(NSString *)path
parameters:(NSDictionary *)parameters
data:(NSData*)data;
NSMutableURLRequest* request = [super requestWithMethod:method
path:path
parameters:parameters];
[request setHTTPBody:data];
return request;
【讨论】:
不能再直接设置数据了。解决方案: NSMutableURLRequest *request = [self requestWithMethod:@"POST" path:path parameters:parameters]; [请求 setHTTPBody:data];【参考方案2】:使用 AFNetworking 2.0,我只需从
复制代码- (AFHTTPRequestOperation *)PUT:(NSString *)URLString
parameters:(id)parameters
success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;
并添加一个
[request setHTTPBody:data];
这里是:
NSString* str = [bookDetailLink objectForKey:@"Body"];
NSData* data = [str dataUsingEncoding: NSUTF8StringEncoding];
NSMutableURLRequest *request = [self.manager.requestSerializer requestWithMethod:@"PUT" URLString:bookingDetailUrl parameters:nil error:nil];
[request setHTTPBody:data];
AFHTTPRequestOperation *operation = [self.manager HTTPRequestOperationWithRequest:request
success:^(AFHTTPRequestOperation *op, NSHTTPURLResponse *response)
NSLog(@"%@", response);
failure:^(AFHTTPRequestOperation *op, NSError *error)
NSLog(@"%@", error);
];
[self.manager.operationQueue addOperation:operation];
我正在使用 AFNetworking 将 Skyscanner API 集成到我们的 ios 应用程序中。
【讨论】:
完美答案!!救了我!!【参考方案3】:对于 AFNetworking 1.3.2,以下代码适用于我:
NSData *imageData = UIImageJPEGRepresentation(thumb, 0.85F);
AFHTTPClient *httpClient = [[AFHTTPClient alloc]
initWithBaseURL:[NSURL URLWithString:@"https://example.com/"]];
NSMutableURLRequest *request = [httpClient
requestWithMethod:@"PUT" path:@"/foo" parameters:nil];
[request setHTTPBody:imageData];
[request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];
AFHTTPRequestOperation *operation = [httpClient
HTTPRequestOperationWithRequest:request
success:^(AFHTTPRequestOperation *op, NSHTTPURLResponse *response)
NSLog(@"%@", response);
failure:^(AFHTTPRequestOperation *op, NSError *error)
NSLog(@"%@", error);
];
[operation start];
这会导致 PUT 请求具有正确的标头、内容长度和一般 RESTful :-)
【讨论】:
以上是关于如何使用 AFNetworking 为“PUT”请求设置数据?的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking 使用 Rails 进行 PUT 和删除