如何使用body和URL中的参数进行经过身份验证的POST?

时间:2016-09-26 17:53:27

标签: ios objective-c afnetworking afnetworking-2

由于服务器的限制,我需要创建一个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中同时发送参数吗?我的实现似乎不太理想。

1 个答案:

答案 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..