AFNetworking 2.0向GET请求添加标头

Mac*_*y18 78 iphone objective-c ios afnetworking afnetworking-2

我刚刚开始使用AFNetworking 2.0,我想知道如何将标头放入HTTP Get请求中.文档设置了这样的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);
}];
Run Code Online (Sandbox Code Playgroud)

但由于我们没有处理,NSURLRequests我不知道如何设置HTTP标头.

任何帮助,将不胜感激.
问候,
迈克

Sha*_*ssy 145

以下是使用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);
}];
Run Code Online (Sandbox Code Playgroud)

关键是以下两行:

manager.requestSerializer = [AFJSONRequestSerializer serializer];
[manager.requestSerializer setValue:@"calvinAndHobbessRock" forHTTPHeaderField:@"X-I-do-what-I-want"];
Run Code Online (Sandbox Code Playgroud)


Rya*_*anR 84

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];
}
Run Code Online (Sandbox Code Playgroud)

  • 你介意添加一个如何使用它的片段?我是一个试图学习ios的机器人,我不太确定如何使用这个答案. (4认同)
  • @PeterLapisu用'nil`为`value`调用这个方法将删除它.您不应该使用标头将短暂值从客户端传递到服务器 - 这是有效负载的一部分.标头用于不经常更改的值,如auth数据,缓存控制等.某些服务器甚至会根据标头参数匹配确定是否返回缓存数据,这是您不希望意外阻止的.如果您只需要为单个请求设置标头,我怀疑它是属于有效负载的数据. (4认同)
  • @PeterLapisu我不知道AFN团队的推理是什么,但从设计的角度来看肯定是有意义的.Serializer是知道如何编码/解码您正在使用的任何协议的请求和响应的东西.如果是通过FTP,您将以不同于Message Queue的方式序列化该信息.这样只有负责该类型传输的组件才知道传输的细节(这是[封装]的一部分(http://en.wikipedia.org/wiki/Encapsulation_(object-oriented_programming)) (2认同)
  • 仍然相信它的设计问题很糟糕https://github.com/AFNetworking/AFNetworking/issues/1793 (2认同)

use*_*541 17

添加响应和请求序列化器解决了我的问题.

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

[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
Run Code Online (Sandbox Code Playgroud)


Car*_*los 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]);

               }
 ];
Run Code Online (Sandbox Code Playgroud)


Chr*_*ris 6

这就是我认为最好的选择.在某个单独的地方,配置一个AFHTTPSessionManager使用an NSURLSessionConfiguration,然后在AFHTTPSessionManager每次要发出请求时使用它.

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

mySingletonSessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:kMyBaseUrl] sessionConfiguration:config];
Run Code Online (Sandbox Code Playgroud)