2016-09-26 32 views
0

由於服務器的限制,我需要製作一個POST,其中包含URL和正文中的參數。我使用AFHTTPRequestOperationManagerHTTPRequestOperationWithRequest方法來做到這一點,因爲我可以初始化與網址參數,如URL請求:如何使用正文和URL中的參數進行身份驗證的POST?

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:components.URL];

然後,我可以單獨設置的身體POST,如:

[request setHTTPBody:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];

的問題時,我已經設置了AFHTTPRequestOperationManagerrequestSerializer使用Authorization頭標記出現。該請求返回爲401 unauth。但是,如果我直接設置請求對象的標題,如:

[request setValue:self.accessToken forHTTPHeaderField:@"Authorization"];

調用成功。任何人都知道更好的方法來進行身份驗證呼叫,同時在身體和POST的URL發送參數?我的實現看起來不太理想。

回答

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.. 
相關問題