我正在使用AFNetworking
,我想创建一个AFHTTPClient
的实例。
此类初始值设定项需要baseUrl
参数。如果我通过"www.mysite.com"
,我怎么能在以后使用同一个客户端和子域?例如“users.mysite.com
”
我不想为我使用的每个子域创建不同的客户端。另外,我无法更改baseUrl
,因为它是只读的。
关于如何实现这一目标的任何想法?
答案 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;
}