2014-10-10 13 views
10

Ho anche bisogno di fare una richiesta di posta al mio server.AFHTTPSessionManager aggiungi corpo a POST

Con AFHTTPRequestOperation è molto semplice basta usare:

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

Tuttavia non riesco a trovare alcun esempio di come utilizzare lo stesso approccio utilizzando il AFHTTPSessionManager.

Usando il metodo:

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

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

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

}]; 

Come aggiungo il corpo al "AFMultipartFormData"?

Grazie a advace

+0

esempio: http://stackoverflow.com/questions/20686179/afhttpsessionmanager-header – kabarga

risposta

12

Come scattata dal AFNetworking home page, per creare una richiesta multipart/form-data, ti chiamano 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); 
}]; 

Ma AFHTTPRequestOperationManager è deprecato. Così, invece, utilizzare AFHTTPSessionManager, per i quali la sintassi del POST con l'constructingBodyWithBlock è molto simile:

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

In alternativa, se si desidera inviare una richiesta della forma foo=bar&key=value&... (vale a dire una richiesta application/x-www-form-urlencoded), avresti fatto qualcosa del tipo:

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

C'è un'altra opzione per collegare i dati al corpo? Ho una stringa con una lista "chiave = valore & chiave = valore & ..." che è la richiesta del mio corpo. Conosci qualche modo per aggiungere una stringa semplice? @Rob – DaSilva

+0

Quel formato 'chiave = valore & chiave = valore & ...' è una richiesta di tipo di contenuto 'application/x-www-form-urlencoded' (mentre quanto sopra crea una richiesta' multipart/form-data'). Se hai bisogno del formato 'application/x-www-form-urlencoded', usa l'altra versione di' POST' senza il parametro 'constructingBodyWithBlock'. – Rob

+0

scusa @Rob ma non ti ho capito completamente. Puoi darmi un esempio di come aggiungere il corpo usando l'altro metodo POST? Grazie – DaSilva

4

Provare questo altro modo.

Sto convertendo la mia immagine in formato dati che è 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); 

}]; 
Problemi correlati