更改 AFHTTPSessionManager 的基本 URL

Posted

技术标签:

【中文标题】更改 AFHTTPSessionManager 的基本 URL【英文标题】:Change Base URL of AFHTTPSessionManager 【发布时间】:2014-11-26 05:53:50 【问题描述】:

我创建了一个带有单例的AFHTTPSessionManager 的子类(代码如下),但现在我需要根据用户位置调整基本 URL(根据用户调用世界不同地区的不同服务器地点)。似乎此类的大多数示例都使用不允许您调整基本 URL(只读属性)的单例。有没有一种简单的方法可以让我使用 AFHTTPSessionManager 调整基本 URL?

 + (RebelBaseManager *)sharedRebelBaseHTTPClient; 

static RebelBaseManager *_sharedRebelBaseHTTPManager = nil;

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^

    _sharedRebelBaseHTTPManager = [[self alloc] initWithBaseURL:[NSURL URLWithString:baseURL];
    _sharedRebelBaseHTTPManager.securityPolicy.allowInvalidCertificates =YES;
);
return _sharedRebelBaseHTTPManager;


【问题讨论】:

共享可变状态是个坏主意。出于这个原因,baseURL 属性为 readonly。相反,您应该根据需要创建具有不同 baseURLs 的实例,或者甚至完全退出该功能。 @mattt 我很害怕 :)...感谢您的回复。 My answer 有点相关,如果您决定手动编写绝对 URL。 【参考方案1】:

对于那些感兴趣的人来说,我创建的方法是我在需要使用AFHTTPSessionManager调整呼叫的基本 URL 时调用的方法

- (AFHTTPSessionManager *) createNewSessionManager 

//Load User Defaults
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

//Create url based on user location
AFHTTPSessionManager *newDataCall = nil;
if (![userDefaults valueForKey:@"baseURL"]) 
    [userDefaults setObject:@"https://BASE-URL" forKey:@"baseURL"];

newDataCall = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:[userDefaults valueForKey:@"baseURL"]]];
newDataCall.securityPolicy.allowInvalidCertificates =YES;
newDataCall.responseSerializer = [AFJSONResponseSerializer serializer];
newDataCall.requestSerializer = [AFJSONRequestSerializer serializer];

return newDataCall;

【讨论】:

我觉得这最终会创建新的 sessionManager 对象。一旦我们更改了 url,我们需要为新的基本 url 调用 initWithBaseURL 函数 是的。因此,在调用此方法之前,我会查看用户在哪里(就位置而言)我正在调用什么基本 url,然后如果我需要调用不同的基本 url(调用世界不同地区的服务器)我调用这个方法。我将应该调用的 url 存储在用户默认值中,您可以在上面的方法中看到。

以上是关于更改 AFHTTPSessionManager 的基本 URL的主要内容,如果未能解决你的问题,请参考以下文章

使用 AFNetworking 2.0 的 POST 请求 - AFHTTPSessionManager

使用 AFHTTPSessionManager 时的内存泄漏

Swift - 为啥在 AFHTTPSessionManager 中需要 init(coder)?

如何使用 AFHTTPSessionManager 访问 422 上的响应正文?

2 AFHTTPSessionManager

使用两个不同的 baseUrl - AFHTTPSessionManager