AFNetworking – 如何在不使用键值对的情况下input和输出原始数据?

我正在尝试使用AFNetworking在CouchDB服务器中创build一个附件。 服务器期望在HTTP正文中使用base64编码的string。 我怎样才能做这个请求,而不使用AFNetworking作为一个键/值对发送HTTP身体?

我开始看这个方法:

 - (void)putPath:(NSString *)path parameters:(NSDictionary *)parameters success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; 

但是这里的参数是types: NSDictionary 。 我只想在HTTP正文中发送一个base64编码的string,但不与一个键相关联。 有人可以指点我适当的方法来使用? 谢谢!

Hejazi的答案很简单,应该很好。

如果出于某种原因,您需要针对一个请求非常具体 – 例如,如果您需要重写标题等 – 您也可以考虑构build您自己的NSURLRequest。

以下是一些(未经testing的)示例代码:

 // Make a request... NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myURL]; // Generate an NSData from your NSString (see below for link to more info) NSData *postBody = [NSData base64DataFromString:yourBase64EncodedString]; // Add Content-Length header if your server needs it unsigned long long postLength = postBody.length; NSString *contentLength = [NSString stringWithFormat:@"%llu", postLength]; [request addValue:contentLength forHTTPHeaderField:@"Content-Length"]; // This should all look familiar... [request setHTTPMethod:@"POST"]; [request setHTTPBody:postBody]; AFHTTPRequestOperation *operation = [client HTTPRequestOperationWithRequest:request success:success failure:failure]; [client enqueueHTTPRequestOperation:operation]; 

NSData类别的方法base64DataFromString 在这里可用 。

你可以使用multipartFormRequestWithMethod方法如下:

 NSURLRequest *request = [self multipartFormRequestWithMethod:@"PUT" path:path parameters:parameters constructingBodyWithBlock:^(id <AFMultipartFormData> formData) { [formData appendString:<yourBase64EncodedString>] }]; AFHTTPRequestOperation *operation = [client HTTPRequestOperationWithRequest:request success:success failure:failure]; [client enqueueHTTPRequestOperation:operation]; 

这里有一个发送原始json的例子:

 NSDictionary *dict = ... NSError *error; NSData *dataFromDict = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:YOUR_URL parameters:nil error:nil]; req.timeoutInterval = 30; [req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [req setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [req setValue:IF_NEEDED forHTTPHeaderField:@"Authorization"]; [req setHTTPBody:dataFromDict]; [[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { if (!error) { NSLog(@"%@", responseObject); } else { NSLog(@"Error: %@, %@, %@", error, response, responseObject); } }] resume]; 
  NSData *data = someData; NSMutableURLRequest *requeust = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:[self getURLWith:urlService]]]; [reqeust setHTTPMethod:@"PUT"]; [reqeust setHTTPBody:data]; [reqeust setValue:@"application/raw" forHTTPHeaderField:@"Content-Type"]; NSURLSessionDataTask *task = [manager uploadTaskWithRequest:requeust fromData:nil progress:^(NSProgress * _Nonnull uploadProgress) { } completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { }]; [task resume]; 

我正在使用AFNetworking 2.5.3并为AFHTTPRequestOperationManager创build新的POST方法。

 extension AFHTTPRequestOperationManager { func POST(URLString: String!, rawBody: NSData!, success: ((AFHTTPRequestOperation!, AnyObject!) -> Void)!, failure: ((AFHTTPRequestOperation!, NSError!) -> Void)!) { let request = NSMutableURLRequest(URL: NSURL(string: URLString, relativeToURL: baseURL)!) request.HTTPMethod = "POST" request.HTTPBody = rawBody let operation = HTTPRequestOperationWithRequest(request, success: success, failure: failure) operationQueue.addOperation(operation) } } 

请使用下面的方法。

 +(void)callPostWithRawData:(NSDictionary *)dict withURL:(NSString *)strUrl withToken:(NSString *)strToken withBlock:(dictionary)block { NSError *error; NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:&error]; NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]]; Please use below method. manager.responseSerializer = [AFHTTPResponseSerializer serializer]; NSMutableURLRequest *req = [[AFJSONRequestSerializer serializer] requestWithMethod:@"POST" URLString:[NSString stringWithFormat:@"%@/%@",WebserviceUrl,strUrl] parameters:nil error:nil]; req.timeoutInterval= [[[NSUserDefaults standardUserDefaults] valueForKey:@"timeoutInterval"] longValue]; [req setValue:strToken forHTTPHeaderField:@"Authorization"]; [req setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; [req setValue:@"application/json" forHTTPHeaderField:@"Accept"]; [req setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]]; [[manager dataTaskWithRequest:req completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) { if (!error) { if ([responseObject isKindOfClass:[NSData class]]) { NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response; if ((long)[httpResponse statusCode]==201) { NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setObject:@"201" forKey:@"Code"]; if ([httpResponse respondsToSelector:@selector(allHeaderFields)]) { NSDictionary *dictionary = [httpResponse allHeaderFields]; NSLog(@"%@",[dictionary objectForKey:@"Location"]); [dict setObject:[NSString stringWithFormat:@"%@",[dictionary objectForKey:@"Location"]] forKey:@"Id"]; block(dict); } } else if ((long)[httpResponse statusCode]==200) { //Leave Hours Calculate NSDictionary *serializedData = [NSJSONSerialization JSONObjectWithData:responseObject options:kNilOptions error:nil]; block(serializedData); } else{ } } else if ([responseObject isKindOfClass:[NSDictionary class]]) { block(responseObject); } } else { NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; [dict setObject:ServerResponceError forKey:@"error"]; block(dict); } }] resume]; }