2017-01-23 11 views
1

Есть ли способ обнаружить 304 Not Modified ответ с Alamofire 4? Я считаю, что Alamofire response.statusCode всегда 200, даже если сервер ответил установки вызова 304.Как обнаружить 304 statusCode с Alamofire

сети:

Alamofire 
    .request("http://domain.com/api/path", method: .get) 
    .validate(statusCode: 200..<300) 
    .validate(contentType: ["application/json"]) 
    .responseJSON { response in 
     print(response.response?.statusCode) 
} 

заголовка ответа Alamofire

<NSHTTPURLResponse: 0x61800003e1c0> { URL: http://domain.com/api/path } { status code: 200, headers { 
    "Access-Control-Allow-Headers" = "content-type, authorization"; 
    "Access-Control-Allow-Methods" = "GET, PUT, POST, DELETE, HEAD, OPTIONS"; 
    "Access-Control-Allow-Origin" = "*"; 
    "Cache-Control" = "private, must-revalidate"; 
    Connection = "keep-alive"; 
    "Content-Type" = "application/json"; 
    Date = "Mon, 23 Jan 2017 23:35:00 GMT"; 
    Etag = "\"f641...cbb6\""; 
    "Proxy-Connection" = "Keep-alive"; 
    Server = "nginx/1.10.1"; 
    "Transfer-Encoding" = Identity; 
} } 

ответа сервера

HTTP/1.1 304 Not Modified 
Server: nginx/1.10.1 
Connection: keep-alive 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Headers: content-type, authorization 
Access-Control-Allow-Methods: GET, PUT, POST, DELETE, HEAD, OPTIONS 
Cache-Control: private, must-revalidate 
ETag: "f641...cbb6" 
Date: Mon, 23 Jan 2017 23:35:00 GMT 
+0

Возможный дубликат [Swift Alamofi re: Как получить код статуса ответа HTTP] (http://stackoverflow.com/questions/29131253/swift-alamofire-how-to-get-the-http-response-status-code) –

+0

[Это] (http : //stackoverflow.com/questions/34737574/alamofire-returns-success-on-error-http-status-codes) также могут быть полезны. –

+0

@AhmadF спасибо за указание на соответствующие ответы, они не рассматривают вопрос под рукой, хотя – Digitech

ответ

3

Поскольку поведение NSURLSessions по умолчанию является абстрагироваться от кэшированных 304 ответов, всегда возвращаются 200 ответов (но на самом деле не перезагружая данные), я сначала должен был изменить cachingPolicy следующим образом:

urlRequest.cachePolicy = .reloadIgnoringCacheData 

Тогда , я настроил коды состояния функции validate принимать ответы 3xx и соответствующим образом обрабатываются коды:

Alamofire.request("https://httpbin.org/get") 
     .validate(statusCode: 200..<400) 
     .responseData { response in 
      switch response.response?.statusCode { 
       case 304?: 
        print("304 Not Modified") 
       default: 
        switch response.result { 
        case .success: 
         print("200 Success") 
        case .failure: 
         print ("Error") 
        } 
       } 
      } 
0

You может использовать проверку ответа вручную с помощью Alamofire, как указано here.

Alamofire.request("https://httpbin.org/get") 
    .validate(statusCode: 200..<300) 
    .validate(contentType: ["application/json"]) 
    .responseData { response in 
     switch response.result { 
     case .success: 
      print("Validation Successful") 
     case .failure(let error): 
      print(error) 
     } 
    } 
+1

С пользовательской проверкой 'response.statusCode' все еще 200, хотя сервер ответил 304 – Digitech

+0

. Можете ли вы добавить объект JSON, который вы получаете на свой вопрос? – CodeBender

+1

Alamofire возвращает кешированную версию JSON, которая идентична вызову с кодом состояния 200 – Digitech