Je viens tout juste de commencer à utiliser AFNetworking 2.0 et je me demandais comment insérer des en-têtes dans une requête HTTP Get. La documentation configure un GET comme ceci:
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
NSDictionary *parameters = @{@"foo": @"bar"};
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
Mais comme nous ne gérons pas NSURLRequests
, je ne sais pas comment définir les en-têtes HTTP.
Toute aide serait appréciée.
Cordialement,
Mike
La documentation fantastique sur AFNetworking 2.0 rend cela un peu difficile à trouver, mais c'est là. Sur le AFHTTPRequestSerializer
est -setValue:forHTTPHeaderField:
.
Sinon, si vous suivez leur approche recommandée consistant à créer un gestionnaire de session dérivé de AFHTTPSessionManager
, cette classe peut remplacer une méthode permettant de modifier les en-têtes de chaque requête -dataTaskWithRequest:completionHandler:
. J'utilise ceci pour examiner les demandes et modifier les en-têtes au cas par cas, et préfère le modifier pour le sérialiseur, car il conserve la responsabilité de la mise en réseau contenue dans ce gestionnaire (et évite les erreurs de singletons)
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *, id, NSError *))completionHandler
{
static NSString *deviceId;
if(!deviceId)
{
deviceId = [[[UIDevice currentDevice] identifierForVendor] UUIDString];
}
NSMutableURLRequest *req = (NSMutableURLRequest *)request;
// Give each request a unique ID for tracing
NSString *reqId = [NSString stringWithFormat:@"%@+%@", deviceId, [[NSUUID UUID] UUIDString] ];
[req setValue:reqId forHTTPHeaderField:"x-myapp-requestId"];
return [super dataTaskWithRequest:req completionHandler:completionHandler];
}
Voici un exemple utilisant AFNetworking 2.0
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"calvinAndHobbesRock" forHTTPHeaderField:@"X-I do what I want"];
[manager GET:@"http://localhost:3000" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSLog(@"JSON: %@", responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", error);
}];
Les clés sont les 2 lignes suivantes:
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"calvinAndHobbessRock" forHTTPHeaderField:@"X-I-do-what-I-want"];
l'ajout d'une réponse et d'une demande de sérialisation a résolu mon problème.
manager.responseSerializer = [AFJSONResponseSerializer serializer];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
J'ai utilisé ce formulaire pour prendre rendez-vous avec un en-tête spécifique.
AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager];
[operationManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[operationManager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[operationManager POST:url
parameters:params
success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (success) {
success(responseObject);
}
}
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Error: %@", [error description]);
}
];
Voici ce que je crois être une meilleure option. Dans un singleton quelque part, configurez un AFHTTPSessionManager
en utilisant un NSURLSessionConfiguration
, puis utilisez ce AFHTTPSessionManager
chaque fois que vous souhaitez faire une demande.
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
config.HTTPAdditionalHeaders = @{@"Accepts": @"application/json"};
mySingletonSessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:kMyBaseUrl] sessionConfiguration:config];
J'ai fait ça ... pour ceux qui passent jeton
[manager.requestSerializer setValue:[NSString stringWithFormat:@"Token token=\"%@\"", _userObj.oAuth] forHTTPHeaderField:@"Authorization"];