Comment définir les données pour une demande de «put» avec Afnetworking?
-
14-11-2019 - |
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
}
];
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 :-)