Question

J'ai commencé à utiliser Afnetworking et cela fonctionne bien quand il arrive à faire de la demande "Get" simple. Cependant, maintenant j'essaie de faire une requête "post". J'utilise le code ci-dessous pour faire la demande "Get". Lorsque vous regardez le puthpath de Afhttpclient Il n'y a aucun moyen de définir les données à utiliser pour le corps. Je suppose qu'il existe une autre façon de résoudre ce problème. J'ai regardé le Afhttpopération comme un moyen de réparer cela. Cependant, je ne fais pas fonctionner cela. Le problème est que je ne sais pas comment l'utiliser avec l'authentification de base.

Quelqu'un pourrait-il me donner un soupçon de comment faire une simple requête "post" avec Afnetworking?

AFHTTPClient* client = [AFHTTPClient clientWithBaseURL:ServerURL];
[client setAuthorizationHeaderWithUsername:self.username 
                                  password:self.password];

NSString* resourcePath = [NSString stringWithFormat:@"/some/resource/%@", 
                          endPath];

[client getPath:resourcePath 
     parameters:nil 
        success:^(AFHTTPRequestOperation *operation, id responseObject) {
            // Success code omitted
        } 
        failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            // Some error handling code omitted
        }
 ];
Était-ce utile?

La solution

Je n'ai trouvé aucun moyen facile de le faire. Mais j'ai fait comme recommandé et créé ma propre sous-classe de Afhttpclient. Dans la sous-classe, j'ai implémenté les méthodes ci-dessous. Cela permet d'effectuer à la fois les requêtes post-request et put-put avec mes propres données.

- (void)postPath:(NSString *)path 
  parameters:(NSDictionary *)parameters 
        data:(NSData*)data
     success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
     failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;
{
    NSURLRequest *request = [self requestWithMethod:@"POST" path:path     parameters:parameters data:data];
    AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];
    [self enqueueHTTPRequestOperation:operation];
}

- (void)putPath:(NSString *)path 
     parameters:(NSDictionary *)parameters 
           data:(NSData*)data
        success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;
{
    NSURLRequest *request = [self requestWithMethod:@"PUT" path:path parameters:parameters data:data];
    AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];
[self enqueueHTTPRequestOperation:operation];
}

-(NSMutableURLRequest*)requestWithMethod:(NSString *)method 
                                    path:(NSString *)path 
                              parameters:(NSDictionary *)parameters 
                                 data:(NSData*)data;
{
    NSMutableURLRequest* request = [super requestWithMethod:method 
                                                      path:path 
                                                parameters:parameters];

    [request setHTTPBody:data];

    return request;
}

Autres conseils

Avec Afnetworking 2.0, je copie simplement le code depuis

- (AFHTTPRequestOperation *)PUT:(NSString *)URLString
                 parameters:(id)parameters
                    success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                    failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure;

et ajouter un

[request setHTTPBody:data];

Voici:

NSString* str = [bookDetailLink objectForKey:@"Body"];
NSData* data = [str dataUsingEncoding: NSUTF8StringEncoding];
    NSMutableURLRequest *request = [self.manager.requestSerializer requestWithMethod:@"PUT" URLString:bookingDetailUrl parameters:nil error:nil];

[request setHTTPBody:data];
AFHTTPRequestOperation *operation = [self.manager HTTPRequestOperationWithRequest:request
                                                                  success:^(AFHTTPRequestOperation *op, NSHTTPURLResponse *response) {
                                                                      NSLog(@"%@", response);
                                                                  }
                                                                  failure:^(AFHTTPRequestOperation *op, NSError *error) {
                                                                      NSLog(@"%@", error);
                                                                  }];

[self.manager.operationQueue addOperation:operation];

J'intégre l'API SkysCanner à notre application iOS à l'aide d'AFNetworking.

Avec afnetworking 1.3.2, le code suivant fonctionne pour moi:

NSData *imageData = UIImageJPEGRepresentation(thumb, 0.85F);

AFHTTPClient *httpClient = [[AFHTTPClient alloc]
    initWithBaseURL:[NSURL URLWithString:@"https://example.com/"]];
NSMutableURLRequest *request = [httpClient
    requestWithMethod:@"PUT" path:@"/foo" parameters:nil];
[request setHTTPBody:imageData];
[request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"];

AFHTTPRequestOperation *operation = [httpClient 
    HTTPRequestOperationWithRequest:request
        success:^(AFHTTPRequestOperation *op, NSHTTPURLResponse *response) {
            NSLog(@"%@", response);
        }
        failure:^(AFHTTPRequestOperation *op, NSError *error) {
            NSLog(@"%@", error);
        }];
[operation start];

Il en résulte une demande de put avec des en-têtes corrects, du contenu-lann et un repos général :-)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top