Swift: URLSession.shared.dataTask говорит, что код состояния 304 = 200?

Я запрашиваю JSON-API следующим образом:

     var request = URLRequest(url: url)
    request.httpMethod = "GET"
    request.addValue(CredentialsProvider.shared.credentials, forHTTPHeaderField: "Authorization")

    let task = URLSession.shared.dataTask(with: request as URLRequest) { data, response, error in
        guard let data = data, let _ = response, error == nil else {
            return
        }

        let response1 = response as! HTTPURLResponse
        print(response1.statusCode) // 200 instead of 304
    }

Поскольку сервер выполняет кеширование (которое я проверил через CharlesProxy), я ожидаю код состояния 304, но регистрируется 200 - есть ли способ получить «настоящий» код состояния?


person swalkner    schedule 11.10.2017    source источник
comment
Вы уверены, что ваш бэкенд указывает статус 304 в желаемом вами варианте использования?   -  person jlmurph    schedule 11.10.2017
comment
@murphguy да, как сказал CharlesProxy   -  person swalkner    schedule 11.10.2017
comment
Вам также не нужно передавать If-Modified-Since в заголовок, чтобы он стал условным запросом на получение, в отличие от неусловного запроса на получение, который у вас есть.   -  person TNguyen    schedule 12.10.2017
comment
попробуй это request.cachePolicy = .reloadIgnoringCacheData   -  person Vini App    schedule 12.10.2017
comment
Это должно быть "POST", а не "GET". Если вам просто нужно скачать, нет необходимости использовать URLRequest, если только вы не собираетесь получать только заголовок. Кстати let _ = response бессмысленно   -  person Leo Dabus    schedule 12.10.2017
comment
@LeoDabus let _ = response приведет к возврату замыкания, если переменная ответа равна нулю.   -  person ekreloff    schedule 12.10.2017
comment
Все еще бессмысленно, у вас есть ошибка, чтобы проверить. Если он хочет развернуть его, просто используйте guard let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200, let data = data, error == nil   -  person Leo Dabus    schedule 12.10.2017
comment
@LeoDabus, почему это будет "POST" вместо "GET", если он ожидает код состояния 304, который вообще не имеет никакого смысла. 304 возвращается только по условному запросу на получение.   -  person TNguyen    schedule 12.10.2017
comment
Я нашел этот комментарий к ответ на аналогичную проблему, которая может представлять интерес. TL;DR: попробуйте downloadTask вместо dataTask.   -  person caseynolan    schedule 12.10.2017
comment
@JackDaw не помог, CharlesProxy опять говорит 304, в приложении вижу 200.   -  person swalkner    schedule 12.10.2017
comment
@TNguyen, зачем мне это нужно? Сервер уже возвращает 304, только я не вижу его в приложении...   -  person swalkner    schedule 12.10.2017
comment
@LeoDabus Вы можете получить пустой ответ и, следовательно, нулевую переменную ответа без ошибки.   -  person ekreloff    schedule 12.10.2017


Ответы (1)


Установка cachePolicy на .reloadIgnoringCacheData сработала для меня.

request.cachePolicy = .reloadIgnoringCacheData

person jmprice    schedule 15.12.2017
comment
Это означает, что вы игнорируете кешированный ответ Akamai/local, что не очень хорошо с точки зрения сети/API. - person Naveen Shan; 23.09.2019