3

我正在使用AFNetworking并且我想创建一个AFHTTPClient. 此类初始化程序需要一个baseUrl参数。如果我通过"www.mysite.com"了,我以后如何将同一个客户端与子域一起使用?例如“ users.mysite.com

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

4

2 回答 2

7

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

从文档:

两者-requestWithMethod:path:parameters:-multipartFormRequestWithMethod:path:parameters:constructingBodyWithBlock:从相对于 的路径构造 URL -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" ...],它会解析为完整的 URL。您也可以编写自己的getPath方法,例如getUserPath- 实现很简单。

于 2013-07-15T13:47:15.987 回答
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;
}
于 2013-07-15T13:18:28.080 回答