2014-10-10 4 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

ответ

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, для которого синтаксис POST с constructingBodyWithBlock очень похожи:

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

+0

Этот формат 'key = value & key = value & ...' представляет собой запрос типа содержимого приложения/x-www-form-urlencoded' (тогда как вышеописанный запрос 'multipart/form-data'). Если вам нужен формат 'application/x-www-form-urlencoded', используйте другое исполнение' POST' без параметра 'constructingBodyWithBlock'. – Rob

+0

Извините @ Rob, но я не понял вас полностью. Можете ли вы дать мне пример того, как добавить тело, используя другой метод POST? Спасибо – DaSilva

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); 

}]; 
Смежные вопросы