AFNetworking:具有子域的AFHTTPClient

时间:2013-07-15 13:11:15

标签: ios afnetworking

我正在使用AFNetworking,我想创建一个AFHTTPClient的实例。 此类初始值设定项需要baseUrl参数。如果我通过"www.mysite.com",我怎么能在以后使用同一个客户端和子域?例如“users.mysite.com

我不想为我使用的每个子域创建不同的客户端。另外,我无法更改baseUrl,因为它是只读的。 关于如何实现这一目标的任何想法?

2 个答案:

答案 0 :(得分:7)

您不必指定相对路径 - 您可以指定绝对路径。

来自文档:

  

-requestWithMethod:path:parameters:-multipartFormRequestWithMethod:path:parameters:constructingBodyWithBlock:都使用-baseURL从相对于NSURL +URLWithString:relativeToURL:的路径构建网址。以下是baseURL和相对路径如何相互作用的几个示例:

NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"];
[NSURL URLWithString:@"foo" relativeToURL:baseURL];                  // http://example.com/v1/foo
[NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL];          // http://example.com/v1/foo?bar=baz
[NSURL URLWithString:@"/foo" relativeToURL:baseURL];                 // http://example.com/foo
[NSURL URLWithString:@"foo/" relativeToURL:baseURL];                 // http://example.com/v1/foo
[NSURL URLWithString:@"/foo/" relativeToURL:baseURL];                // http://example.com/foo/
[NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // http://example2.com/
  

另外需要注意的是,任何baseURL都会添加一个尾部斜杠而没有一个斜杠,否则在使用没有前导斜杠的路径构造URL时会导致意外行为。

因此,您可以执行[[MyClient sharedClient] getPath:@"http://users.mysite.com/etc" ...]之类的操作,然后它将解析为完整的网址。您也可以编写自己的getPath方法,例如getUserPath - 实现很简单。

答案 1 :(得分:1)

我通过创建多个单身来解决类似的问题:

+ (id)sharedJSONClient
{
  static dispatch_once_t pred = 0;
  __strong static id __jsonClient = nil;
  dispatch_once(&pred, ^{
    __jsonClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:[TSAPIURL stringByAppendingString:@"json/"]]];
    [__jsonClient setParameterEncoding:AFFormURLParameterEncoding];
    [__jsonClient registerHTTPOperationClass:[AFJSONRequestOperation class]];
  });
  return __jsonClient;
}

+ (id)sharedXMLClient
{
  static dispatch_once_t pred = 0;
  __strong static id __xmlClient = nil;
  dispatch_once(&pred, ^{
    __xmlClient = [[self alloc] initWithBaseURL:[NSURL URLWithString:[TSAPIURL stringByAppendingString:@"xml/"]]];
    [__xmlClient setParameterEncoding:AFFormURLParameterEncoding];
    [__xmlClient registerHTTPOperationClass:[AFHTTPRequestOperation class]];
  });
  return __xmlClient;
}