2015-09-28 164 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