首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AFNetworking:如何使AFHTTPClient同时处理json和AFHTTPClient响应?

AFNetworking:如何使AFHTTPClient同时处理json和AFHTTPClient响应?
EN

Stack Overflow用户
提问于 2014-02-08 22:50:58
回答 1查看 1.3K关注 0票数 2

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

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

我想要的是:

代码语言:javascript
复制
chairs.com  GET customerprofile  ---> returns XML (no option for json)

charis.com GET inventory ---> returns JSON (no option for xml)

这是多个AFHTTPClients的工作吗?谢谢

EN

回答 1

Stack Overflow用户

发布于 2014-02-09 22:07:27

您对AFHTTPClient的使用表明您正在使用AFNetworking 1,但我将为将来的读者回答这两个版本的问题。

AFNetworking 1.x

您只需注册适当的AFHTTPOperation子类即可。这通常是在initWithBaseURL:子类中完成的。

代码语言:javascript
复制
- (instancetype) initWithBaseURL:(NSURL *)url {
    self = [super initWithBaseURL:url];

    if (self) {
        [self registerHTTPOperationClass:[AFJSONRequestOperation class]];
        [self registerHTTPOperationClass:[AFXMLRequestOperation class]];
    }
    
    return self;
}

当您的应用程序发出一个传出请求时,您需要确保您的accept头被适当设置(例如,text/jsontext/xml,这取决于您期望从哪个端点命中)。否则,AFNetworking将不知道在哪个请求中使用哪个操作。

有几种方法可以轻松地解决这个Accept报头需求。如果您的一个端点是一般规则的例外,我可以通过重写requestWithMethod:path:parameters:来做到这一点。

代码语言:javascript
复制
- (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。文件对此作了最好的说明:

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

例如:

代码语言:javascript
复制
AFJSONResponseSerializer *jsonSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:0];
AFXMLDocumentSerializer *xmlSerializer = [AFXMLDocumentSerializer serializerWithXMLDocumentOptions:0];

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

[AFHTTPSessionManager manager].responseSerializer = compoundSerializer;
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21652785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档