2013-10-19 168 views
76

我剛開始使用AFNetworking 2.0,我想知道如何將頭放入HTTP Get請求。文檔設置了這樣一個GET:AFNetworking 2.0添加頭到GET請求

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
NSDictionary *parameters = @{@"foo": @"bar"}; 
[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) { 
NSLog(@"JSON: %@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
NSLog(@"Error: %@", error); 
}]; 

但是因爲我們沒有處理NSURLRequests我不知道如何設置HTTP頭。

任何幫助,將不勝感激。
關注,
邁克

+0

的可能重複[如何自定義標題添加到AFNetworking在JSONRequestOperation(http://stackoverflow.com/questions/15141115 /如何添加自定義標頭到afnetworking-on-a-jsonrequestoperation) – RyanR

+3

@RyanR不是重複的。這是從AFN 1.x不是2.0。從那以後,一切都徹底改變了。 – Mackey18

+0

根據[遷移指南](https://github.com/AFNetworking/AFNetworking/wiki/AFNetworking-2.0-Migration-Guide)AFHttpClient仍然存在,仍然有責任爲您的應用程序執行Http請求 – RyanR

回答

82

AFNetworking 2.0的奇妙文檔使這有點難找,但它在那裏。在AFHTTPRequestSerializer-setValue:forHTTPHeaderField:

或者,如果按照他們推薦的方法創建從AFHTTPSessionManager派生的會話管理器,那麼該類可以覆蓋每個請求-dataTaskWithRequest:completionHandler:上修改標題的方法。我用這個來檢查的要求和修改的情況下,逐案頭,它寧願修改串行器,因爲它使聯網包含在該經理的責任(並避免與單身碴)

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURLResponse *, id, NSError *))completionHandler 
{ 
    static NSString *deviceId; 
    if(!deviceId) 
    { 
     deviceId = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 
    } 

    NSMutableURLRequest *req = (NSMutableURLRequest *)request; 
    // Give each request a unique ID for tracing 
    NSString *reqId = [NSString stringWithFormat:@"%@+%@", deviceId, [[NSUUID UUID] UUIDString] ]; 
    [req setValue:reqId forHTTPHeaderField:"x-myapp-requestId"]; 
    return [super dataTaskWithRequest:req completionHandler:completionHandler]; 
} 
+0

感謝隊友。讚賞。 – Mackey18

+4

你是否介意添加一個這將如何使用的片段?即時通訊一個Android的傢伙試圖學習ios和我不太清楚如何把這個答案使用。 – ChuckKelly

+1

但爲什麼在serialiser中設置的頭文件?我也注意到,這種方式他們是持久的,所以一旦你設置了一個標題字段,它會永遠保持在那裏! (我不得不添加我自己的方法來刪除它們) –

139

下面是使用AFNetworking 2.0

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
manager.requestSerializer = [AFJSONRequestSerializer serializer]; 
[manager.requestSerializer setValue:@"calvinAndHobbesRock" forHTTPHeaderField:@"X-I do what I want"]; 

[manager GET:@"http://localhost:3000" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"JSON: %@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

關鍵的例子有以下2行:

manager.requestSerializer = [AFJSONRequestSerializer serializer]; 
[manager.requestSerializer setValue:@"calvinAndHobbessRock" forHTTPHeaderField:@"X-I-do-what-I-want"]; 
+1

謝謝你的例子!! – diegomen

17

加入響應和請求串行化器解決了我proble米

manager.responseSerializer = [AFJSONResponseSerializer serializer]; 
manager.requestSerializer = [AFJSONRequestSerializer serializer]; 

[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
7

我已經使用此表單來預約特定的標題。

AFHTTPRequestOperationManager *operationManager = [AFHTTPRequestOperationManager manager]; 
[operationManager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
[operationManager.requestSerializer setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 

[operationManager POST:url 
      parameters:params 
       success:^(AFHTTPRequestOperation *operation, id responseObject) { 

        if (success) { 
         success(responseObject); 
        } 

       } 
       failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

        NSLog(@"Error: %@", [error description]); 

       } 
]; 
+0

你不是嗎想一想,這些標題會在您設置它們的那一刻發出任何請求? – vahotm

-3

使用下面的代碼把任何類型的報頭值的:

[[FRHTTPReqManager sharedManager].requestSerializer setValue:value forHTTPHeaderField:key]; 
6

這裏就是我認爲是一個最好的選擇。在某個單身人士處,使用NSURLSessionConfiguration配置AFHTTPSessionManager,然後在每次要發出請求時使用AFHTTPSessionManager

NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
config.HTTPAdditionalHeaders = @{@"Accepts": @"application/json"}; 

mySingletonSessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:kMyBaseUrl] sessionConfiguration:config]; 
2

我沒這個......對於那些逝去的令牌

[manager.requestSerializer setValue:[NSString stringWithFormat:@"Token token=\"%@\"", _userObj.oAuth] forHTTPHeaderField:@"Authorization"];