web-dev-qa-db-fra.com

AFNetworking 2.0 ajoute des en-têtes à la requête GET

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

78
Mackey18

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];
}
83
RyanR

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"];
145
Shaheen Ghiassy

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"];
17
user2073541

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

               }
 ];
7
Carlos Avalos

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];
6
Chris

J'ai fait ça ... pour ceux qui passent jeton

[manager.requestSerializer setValue:[NSString stringWithFormat:@"Token token=\"%@\"", _userObj.oAuth] forHTTPHeaderField:@"Authorization"];
2
Surge Pedroza