一个AFTHTTPClient可以同时处理json和xml吗?
我只有一个域,其中一些服务只返回json,而其他服务只返回xml。如何发出GET请求并指示AFHTTPClient对某些服务使用AFJSONRequestOperation,对其他GET请求使用AFXMLRequestOperation?
我想要的是:
chairs.com GET customerprofile ---> returns XML (no option for json)
charis.com GET inventory ---> returns JSON (no option for xml)这是多个AFHTTPClients的工作吗?谢谢
发布于 2014-02-09 22:07:27
您对AFHTTPClient的使用表明您正在使用AFNetworking 1,但我将为将来的读者回答这两个版本的问题。
AFNetworking 1.x
您只需注册适当的AFHTTPOperation子类即可。这通常是在initWithBaseURL:子类中完成的。
- (instancetype) initWithBaseURL:(NSURL *)url {
self = [super initWithBaseURL:url];
if (self) {
[self registerHTTPOperationClass:[AFJSONRequestOperation class]];
[self registerHTTPOperationClass:[AFXMLRequestOperation class]];
}
return self;
}当您的应用程序发出一个传出请求时,您需要确保您的accept头被适当设置(例如,text/json或text/xml,这取决于您期望从哪个端点命中)。否则,AFNetworking将不知道在哪个请求中使用哪个操作。
有几种方法可以轻松地解决这个Accept报头需求。如果您的一个端点是一般规则的例外,我可以通过重写requestWithMethod:path:parameters:来做到这一点。
- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
path:(NSString *)path
parameters:(NSDictionary *)parameters {
request = [super requestWithMethod:method path:path parameters:parameters];
if (/* the endpoint specified in path returns XML */) {
[request setValue:@"text/xml" forHTTPHeaderField:@"Accept"];
} else {
[request setValue:@"text/json" forHTTPHeaderField:@"Accept"];
}
}这是对告诉你,别问的小违反,请随时根据需要进行重构。
如果您不打算升级到AFNetworking 2,那么您可以停止在这里阅读。
AFNetworking 2.x
AFNetworking的2.0版使这更简单,更直观。在2.0中,序列化责任被划分为一个单独的类。此类的实例称为响应序列化程序。升级时,您将需要一个AFCompoundResponseSerializer。文件对此作了最好的说明:
AFCompoundSerializer是AFHTTPSerializer的子类,它将响应序列化委托给第一个AFHTTPSerializer对象,该对象将YES返回给validateResponse:data:error:,返回到AFHTTPSerializer的默认行为。这对于使用单个序列化程序支持服务器响应的多个潜在类型和结构非常有用。
例如:
AFJSONResponseSerializer *jsonSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:0];
AFXMLDocumentSerializer *xmlSerializer = [AFXMLDocumentSerializer serializerWithXMLDocumentOptions:0];
AFCompoundResponseSerializer *compoundSerializer = [AFCompoundResponseSerializer compoundSerializerWithResponseSerializers:@[jsonSerializer, xmlSerializer]];
[AFHTTPSessionManager manager].responseSerializer = compoundSerializer;https://stackoverflow.com/questions/21652785
复制相似问题