2013-10-19 117 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"];