2015-09-28 78 views
0

我试图使用AFNetworking在每个请求的基础上设置自定义头,但偶尔会在设置后看起来会消失。下面是用来做请求的代码......AFNetworking请求头被设置后丢失

+ (void) getWithURI: (NSString*) uri header: (NSDictionary*) header success: (NSString*) successCallback failure: (NSString*)errorCallback dispatch: (NSString*)dispatchedId 
{ 
    createManagerInstance(); 

    AFHTTPRequestOperation* operation = [manager GET:uri 
              parameters:nil 
              success:^(AFHTTPRequestOperation *operation, id responseObject) { 
               [RestWrapper succeededWithJson:operation.responseString dispatchedId:dispatchedId successCallback:successCallback]; 
              } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
               [RestWrapper failedWithJson:operation.responseString dispatchedId:dispatchedId errorCallback:errorCallback]; 
              }]; 

    NSMutableURLRequest* request = (NSMutableURLRequest*)operation.request; 
    for (NSString* key in header) 
    { 
     if([request valueForHTTPHeaderField:key] != nil) 
     { 
      [request setValue:header[key] forHTTPHeaderField:key]; 
     } 
     else 
     { 
      [request addValue:header[key] forHTTPHeaderField:key]; 
     } 
    } 
    NSLog(@"Headers: %@", request.allHTTPHeaderFields); 

    [operation start]; 
} 

对于我的要求的95%,他们通过如预期。然而,偶尔会有一些失败,并指示缺少标题。这已通过使用Fiddler捕获有问题的请求并查看头文件实际上丢失来确认。尽管如此,控制台日志request.allHTTPHeaderFields总是显示标题。

我注意到的唯一的另一件事是,一般来说,Fiddler会将缓存策略报告为每个请求的“max-age = 0,private,must-revalidate”。但是,每当请求丢失自定义标头时,它的缓存策略就是“no-cache”。

回答

1

这是因为您以错误的方式添加HTTP标头字段。

您应该在请求前添加它。您可以尝试这样的事:

+ (void) getWithURI: (NSString*) uri header: (NSDictionary*) header success: (NSString*) successCallback failure: (NSString*)errorCallback dispatch: (NSString*)dispatchedId{ 
createManagerInstance(); 

manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

[manager.requestSerializer setValue:header[key] forHTTPHeaderField:key]; 

AFHTTPRequestOperation* operation = [manager GET:uri 
             parameters:nil 
             success:^(AFHTTPRequestOperation *operation, id responseObject) { 
              [RestWrapper succeededWithJson:operation.responseString dispatchedId:dispatchedId successCallback:successCallback]; 
             } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
              [RestWrapper failedWithJson:operation.responseString dispatchedId:dispatchedId errorCallback:errorCallback]; 
             }]; 

[operation start]; 

}

+0

谢谢,这个固定的问题。 – BJO