AFNetworking:如何使AFHTTPClient处理json和xml响应?

use*_*719 2 xml json ios afnetworking

一个AFTHTTPClient可以同时处理json和xml吗?

我有一个域,其中一些服务只返回json,而其他只返回xml.我如何发出GET请求并指示AFHTTPClient将AFJSONRequestOperation用于某些服务,并将AFXMLRequestOperation用于其他GET请求?

所以我想要的是:

chairs.com  GET customerprofile  ---> returns XML (no option for json)

charis.com GET inventory ---> returns JSON (no option for xml)
Run Code Online (Sandbox Code Playgroud)

这是多个AFHTTP客户端的工作吗?谢谢

Aar*_*ger 7

你的使用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;
}
Run Code Online (Sandbox Code Playgroud)

当你的应用程序,使得输出请求,你需要确保你的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"];
    }

}
Run Code Online (Sandbox Code Playgroud)

这是一个小违规告诉,不要问 ; 在必要时随意重构.

如果您不打算升级到AFNetworking 2,那么您可以在这里停止阅读.

AFNetworking 2.x

AFNetworking 2.0版使这更简单,更直观.在2.0中,序列化责任分为一个单独的类.此类的实例称为响应序列化程序.升级时,您需要一个AFCompoundResponseSerializer.文档最好地描述了它:

AFCompoundSerializer是一个子类,AFHTTPSerializer它将响应序列化委托给AFHTTPSerializer返回的第一个对象,返回YESvalidateResponse:data:error:默认行为AFHTTPSerializer.这对于使用单个序列化程序支持多种潜在类型和结构的服务器响应非常有用.

例如:

AFJSONResponseSerializer *jsonSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:0];
AFXMLDocumentSerializer *xmlSerializer = [AFXMLDocumentSerializer serializerWithXMLDocumentOptions:0];

AFCompoundResponseSerializer *compoundSerializer = [AFCompoundResponseSerializer compoundSerializerWithResponseSerializers:@[jsonSerializer, xmlSerializer]];

[AFHTTPSessionManager manager].responseSerializer = compoundSerializer;
Run Code Online (Sandbox Code Playgroud)