2014-10-10 36 views
10

我也需要向我的服務器發送發佈請求。AFHTTPSessionManager將主體添加到POST

隨着AFHTTPRequestOperation非常簡單隻需使用:

[request setHTTPBody: [requestBody dataUsingEncoding:NSUTF8StringEncoding]]; 

但是我無法找到如何使用AFHTTPSessionManager使用同樣的方法任何例子。

使用方法:

[self POST:@"extraLink" parameters:nil constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 

} success:^(NSURLSessionDataTask *task, id responseObject) { 

} failure:^(NSURLSessionDataTask *task, NSError *error) { 

}]; 

如何我添加了人體的 「AFMultipartFormData」?

感謝advace

+0

例如:http://stackoverflow.com/questions/20686179/afhttpsessionmanager-header – kabarga 2014-10-10 11:51:28

回答

12

由於從AFNetworking home page拍攝,營造multipart/form-data要求,你叫appendPartWithFileURL

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
NSDictionary *parameters = @{@"foo": @"bar"}; 
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; 
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    [formData appendPartWithFileURL:filePath name:@"image" error:nil]; 
} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"Success: %@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

AFHTTPRequestOperationManager已被棄用。所以,相反,使用AFHTTPSessionManager,對於其中POSTconstructingBodyWithBlock的語法非常相似:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
NSDictionary *parameters = @{@"foo": @"bar"}; 
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; 
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    [formData appendPartWithFileURL:filePath name:@"image" error:nil]; 
} progress:nil success:^(NSURLSessionDataTask *operation, id responseObject) { 
    NSLog(@"Success: %@", responseObject); 
} failure:^(NSURLSessionDataTask *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

另外,如果你想發佈形式foo=bar&key=value&...的請求(即application/x-www-form-urlencoded請求)你會做這樣的事情:

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; 
NSDictionary *parameters = @{@"foo": @"bar", @"key": @"value"}; 
[manager POST:@"http://example.com/resources.json" parameters:parameters progress:nil success:^(NSURLSessionDataTask *task, id responseObject) { 
    NSLog(@"Success: %@", responseObject); 
} failure:^(NSURLSessionDataTask *task, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 
+0

還有另一種選擇將數據附加到身體?我有一個帶有「key = value&key = value&...」列表的字符串,這是我的身體請求。你知道任何添加純字符串的方法嗎? @Rob – DaSilva 2014-10-10 12:01:43

+0

'key = value&key = value&...'格式是一個'application/x-www-form-urlencoded'內容類型的請求(而上面創建了'multipart/form-data'請求)。如果您需要'application/x-www-form-urlencoded'格式,請使用'POST'的其他格式,而不使用'constructBodyWithBlock'參數。 – Rob 2014-10-10 12:05:25

+0

對不起@Rob,但我完全不理解你。你能給我一個如何使用其他POST方法添加正文的例子嗎?謝謝 – DaSilva 2014-10-10 12:13:18

4

試試這個辦法了。

我正在轉換我的圖像數據格式是imageData

NSData *imageData=nil; 
imageData = UIImageJPEGRepresentation([UIImage imageNamed:@"yourimageName"],0.2); 
NSMutableDictionary *dict=[NSMutableDictionary new]; 
[dict setObject:@"user1" forKey:@"param_name1"]; 
[dict setObject:@"User2" forKey:@"param_name2"]; 

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] init]; 

[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"]; 
manager.responseSerializer = [AFJSONResponseSerializer 
           serializerWithReadingOptions:NSJSONReadingAllowFragments]; 
[manager POST:@"API NAME" parameters:dict constructingBodyWithBlock:^(id<AFMultipartFormData> _Nonnull formData) { 

if(imageData) 
{ 
    [formData appendPartWithFileData:imageData name:@"param_name" fileName:@"filename.jpg" mimeType:@"image/jpeg"]; 
} 
} progress:^(NSProgress * _Nonnull uploadProgress) 
{ 
    NSLog(@"%@",uploadProgress); 
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
    NSLog(@"%@",responseObject); 

} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
    NSLog(@"%@",error); 

}];