由于服务器的限制,我需要创建一个POST
,其中包含URL和正文中的参数。我正在使用AFHTTPRequestOperationManager
的{{1}}方法来完成此操作,因为我可以使用URL参数初始化URL请求,如:
HTTPRequestOperationWithRequest
然后我可以单独设置NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:components.URL];
的正文:
POST
当我将[request setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];
的{{1}}设置为使用Authorization标头令牌时,会出现问题。该请求以AFHTTPRequestOperationManager
的形式返回。但是,如果我直接设置请求对象的标题,如:
requestSerializer
通话成功。任何人都知道一种更好的方法来进行经过身份验证的调用,该调用会在正文和401 unauth
的URL中同时发送参数吗?我的实现似乎不太理想。
答案 0 :(得分:2)
除非您需要支持iOS6,否则我认为您应该转而使用AFHTTPSessionManager而不是AFHTTPRequestOperationManager。
子类AFHTTPSessionManager并覆盖:
- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request
uploadProgress:(void (^)(NSProgress * _Nonnull))uploadProgressBlock
downloadProgress:(void (^)(NSProgress * _Nonnull))downloadProgressBlock
completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))completionHandler {
NSMutableURLRequest *modifiedRequest = request.mutableCopy;
NSString *token = [Get your access token];
[modifiedRequest addValue:token forHTTPHeaderField:@"Authorization"];
// Now set up the data task as normal
return [super dataTaskWithRequest:modifiedRequest
uploadProgress:uploadProgressBlock
downloadProgress:downloadProgressBlock
completionHandler:completionHandler];
}
它与您的方法相同(我不知道更好的方法) - 但确保它会自动发生在所有呼叫中。
将会话管理器初始化为子类的实例。
然后使用AFNetworking的POST方法,设置参数并转到:
NSDictionary *params = @{@"Param1":param1 ? param1 : @"",
@"Param2":param2 ? param2 : @""};
[self.sessionManager
POST:self.serviceEndpointUrl
parameters:params
etc..