Salut, je fais un singleton pour la mise en réseau pour la réponse JSON et XML
mon ApiClient.h
+ (ApiClient *)sharedInstance; -(instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration;
Mon ApiClient.m
+ (ApiClient *)sharedInstance { static ApiClient *sharedInstance = nil; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate, ^{ NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; sharedInstance = [[self alloc] initWithBaseURL:[NSURL URLWithSsortingng:SINGPOST_BASE_URL] sessionConfiguration:sessionConfiguration]; [sharedInstance setDataTaskWillCacheResponseBlock:^NSCachedURLResponse *(NSURLSession *session, NSURLSessionDataTask *dataTask, NSCachedURLResponse *proposedResponse) { NSHTTPURLResponse *resp = (NSHTTPURLResponse*)proposedResponse.response; NSMutableDictionary *newHeaders = [[resp allHeaderFields] mutableCopy]; if (newHeaders[@"Cache-Control"] == nil) { newHeaders[@"Cache-Control"] = @"max-age=120, public"; } NSURLResponse *response2 = [[NSHTTPURLResponse alloc] initWithURL:resp.URL statusCode:resp.statusCode HTTPVersion:nil headerFields:newHeaders]; NSCachedURLResponse *cachedResponse2 = [[NSCachedURLResponse alloc] initWithResponse:response2 data:[proposedResponse data] userInfo:[proposedResponse userInfo] storagePolicy:NSURLCacheStorageAllowed]; return cachedResponse2; }]; }); return sharedInstance; } -(instancetype)initWithBaseURL:(NSURL *)url sessionConfiguration:(NSURLSessionConfiguration *)configuration { self = [super initWithBaseURL:url sessionConfiguration:configuration]; if (self) { } return self; }
Le problème est que le singleton ne peut pas gérer les réponses XML et JSON. Il peut parsingr avec succès le JSON et XML pour 1 fois. Mais lorsque vous appelez pour parsingr à nouveau) (après avoir analysé XML avec succès), le résultat ne sera pas analysé correctement (donnez une réponse de string hexadécimale)
Ma request de blocage JSON
- (void)sendJSONRequest:(NSMutableURLRequest *)request success:(void (^)(NSURLResponse *response, id responseObject))success failure:(void (^)(NSError *error))failure { self.responseSerializer.acceptableContentTypes = [AFHTTPResponseSerializer serializer].acceptableContentTypes; NSURLSessionDataTask *dataTask = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { if (error) { NSLog(@"Error URL: %@",request.URL.absoluteSsortingng); NSLog(@"Error: %@", error); failure(error); } else { NSDictionary *jsonDict = (NSDictionary *) responseObject; success(response,jsonDict); NSLog(@"Success URL: %@",request.URL.absoluteSsortingng); NSLog(@"Success %@",jsonDict); } }]; [dataTask resume]; }
Ma request de blocage XML
- (void)sendXMLRequest:(NSMutableURLRequest *)request success:(void (^)(NSURLResponse *response, RXMLElement *responseObject))success failure:(void (^)(NSError *error))failure { self.requestSerializer = [AFHTTPRequestSerializer serializer]; self.responseSerializer = [AFHTTPResponseSerializer serializer]; [self.responseSerializer.acceptableContentTypes setByAddingObject:@"application/xml"]; NSURLSessionDataTask *dataTask = [self dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) { if (error) { NSLog(@"Error URL: %@",request.URL.absoluteSsortingng); NSLog(@"Error: %@", error); failure(error); } else { RXMLElement *rootXml = [RXMLElement elementFromXMLData:responseObject]; success(response, rootXml); NSLog(@"Success URL: %@",request.URL.absoluteSsortingng); NSLog(@"Success %@",rootXml); } }]; [dataTask resume]; }
Ma string hexadécimale échoue la réponse:
De toute façon pour faire fonctionner le singleton correctement ou j'ai besoin de faire 2 singleton pour la réponse JSON et XML? Toute aide est très appréciée. Merci!
Votre erreur vous indique probablement qu'il attendait un Content-Type
d' application/xml
, et que vous avez eu une application/json
. C'est difficile à dire parce que vous n'avez pas partagé l'erreur complète, mais c'est probablement quelque chose comme ça.
Il y a deux approches logiques. Non plus:
Avoir AFHTTPSessionManager
unique accepter XML et JSON. Ainsi, avec responseSerializer
de AFHTTPResponseSerializer
et un acceptableContentTypes
de application/xml
et application/json
(ou tout type de Content-Type
spécifique renvoyé par vos deux services Web), puis lorsque vous recevez l'object de réponse NSData
XML ou JSON comme approprié.
Avoir des objects AFHTTPSessionManager
séparés, un pour XML (avec responseSerializer
de AFXMLResponseSerializer
) et un pour JSON (avec responseSerializer
de AFJSONResponseSerializer
). Notez que si vous faites cela, vous n'avez pas besoin d'ajuster acceptableContentTypes
du tout.