2013-12-06 3 views
14

Я использую новую версию AFNetworking, и я не могу понять, как читать заголовки ответа. Я использую AFHTTPSessionManager для выполнения моего запроса, все работает хорошо, но я не могу найти поле ответа заголовка.AFNetworking 2.0 // Как читать заголовок ответа

Вот как я проследовать

 self.sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:BASE_URL]]; 
    [self.sessionManager GET:urlId parameters:nil 
         success:^(NSURLSessionDataTask *task, id responseObject) { 

          if ([self.delegate respondsToSelector:@selector(userIsLoadedWithInfos:)]) { 
           [self.delegate userIsLoadedWithInfos: responseObject]; 
          } 
         } failure:^(NSURLSessionDataTask *task, NSError *error) { 
          if ([self.delegate respondsToSelector:@selector(userLoadingFailed)]) { 
           [self.delegate userLoadingFailed]; 
          } 
         } 
     ]; 

Я пытаюсь прочитать атрибут отклика задачи, но возвращать NSURLResponse которым не включает заголовки. Кто-нибудь теперь читает заголовки ответов с версией 2.0? Благодаря

ответ

14

Вы пытались получить заголовки из NSURLResponse что возвращение,

Вы можете попробовать что-то подобное с объектом NSURLResponse,

NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*)response; 
if ([httpResponse respondsToSelector:@selector(allHeaderFields)]) { 
    NSDictionary *dictionary = [httpResponse allHeaderFields]; 
    NSLog([dictionary description]); 
} 

Надежда Это поможет вам.!

+0

Я уже пытался, но, кажется, что NSURLResponse не включает в себя метод allHeaderFields. Только класс NSHTTPURLResponse включает его –

+0

@MtotheK: проверьте обновленный ответ, преобразуйте свой ответ в NSHTTPURLResponse. –

+2

@Virussmca: пожалуйста, не вызывайте преобразование каста. это вводит в заблуждение. – vikingosegundo

3

I подклассы AFHTTPRequestOperationManager и использовать: метод

- (AFHTTPRequestOperation *)POST:(NSString *)URLString 
         parameters:(NSDictionary *)parameters 
         success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success 
         failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure; 

для большинства моих запросов веб-службы. При использовании этого метода заголовки ответов будут частью объекта операции. Что-то вроде этого:

[self POST:url parameters:newParams success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    // Response headers will be a dictionary 
    NSDictionary *headers = operation.response.allHeaderFields; 
... 
13

чуть более надежный код, чем Viruss MCS-:

if ([task.response isKindOfClass:[NSHTTPURLResponse class]]) { 
    NSHTTPURLResponse *r = (NSHTTPURLResponse *)task.response; 
    NSLog(@"%@" ,[r allHeaderFields]); 
} 

возвращает

{ 
    Connection = "Keep-Alive"; 
    "Content-Length" = 12771; 
    "Content-Type" = "application/json"; 
    Date = "Fri, 06 Dec 2013 10:40:48 GMT"; 
    "Keep-Alive" = "timeout=5"; 
    "Proxy-Connection" = "Keep-Alive"; 
    Server = "gunicorn/18.0"; 
} 

так же вы можете гарантировать отливку сделано правильно с [response respondsToSelector:@selector(allHeaderFields)], но вы должны также позвоните, прежде чем делать литье

if ([task.response respondsToSelector:@selector(allHeaderFields)]) { 
    NSHTTPURLResponse *r = (NSHTTPURLResponse *)task.response; 
    NSLog(@"%@" ,[r allHeaderFields]); 
} 

или нет бросок на все:

if ([task.response respondsToSelector:@selector(allHeaderFields)]) { 
    NSLog(@"%@" ,[task.response performSelector:@selector(allHeaderFields)]); 
} 
4

Интересно, что приведенные выше ответы показывают, что параметр id responseObject возвращает NSURLResponse. Я использую сервер JAX-RS на бэкэнд, и я получаю другой ответ. При выполнении команды curl против моего сервера, мой ответ таков:

$ curl -v "http://10.0.1.8:3000/items" 
* About to connect() to 10.0.1.8 port 3000 (#0) 
* Trying 10.0.1.8... 
* Adding handle: conn: 0x7f9f51804000 
* Adding handle: send: 0 
* Adding handle: recv: 0 
* Curl_addHandleToPipeline: length: 1 
* - Conn 0 (0x7f9f51804000) send_pipe: 1, recv_pipe: 0 
* Connected to 10.0.1.8 (10.0.1.8) port 3000 (#0) 
> GET /items HTTP/1.1 
> User-Agent: curl/7.30.0 
> Host: 10.0.1.8:3000 
> Accept: */* 
> 
< HTTP/1.1 200 OK 
< ETag: af0057e2-1c6d-4a47-b81a-a754238b60fd 
< Content-Type: application/json 
< Content-Length: 255 
< Connection: keep-alive 
< 
* Connection #0 to host 10.0.1.8 left intact 
[{"name":"Item1","uid":"F465AAD2-AA39-4C33-A57A-F0543C25C476"}, 
{"name":"Item2","uid":"6505A82E-A473-4A7D-BC4B-BCBEFFFE8E9C"}] 

Мой responseObject представляет собой массив элементов в теле ответа сервера и не NSURLResponse. Вот как я извлекла заголовки:

void (^handleSuccess)(NSURLSessionDataTask *, id) = ^(NSURLSessionDataTask *task, id responseObject) { 
    // handle response headers 
    NSHTTPURLResponse *response = ((NSHTTPURLResponse *)[task response]); 
    NSDictionary *headers = [response allHeaderFields]; 

    // handle response body 
    NSArray *responseItems = responseObject; 
    for (NSDictionary *item in responseItems) { 
     [self.activeDataController createObject:item]; 
    } 
}; 
+0

Идеальное объяснение того, почему принятый ответ неверен. – dmzza

0

Для быстрой 2,0:

if let response = operation.response { 
    print(response.allHeaderFields) 
} 
+1

Хотя этот фрагмент кода может решить вопрос, [включая объяснение] (http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) из кода действительно помогает улучшить качество вашего поста. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причин вашего предложения кода. Попробуйте не толковать код с пояснительными комментариями, что уменьшает читаемость кода и объяснений! –

Смежные вопросы