将 HTTP 响应添加到缓存

Adding HTTP response to cache

我有一个对象,其中包含使用 POST 请求从远程服务器接收到的一些文本数据。每次打开页面时,应用程序都会向远程服务器发出请求。

如何进行缓存?

这是我没有缓存的代码:

import Foundation

struct NewsFeed: Codable {
    var status: String = ""
    var totalResults: Int = 0
    var posts: [PostItem]
}

struct PostItem: Codable {
    var id: Int
    var title: String
    var link: String
    var date: String
    var category: String
    var thumbnail: String
    var excerpt: String
    var content: String
}

class NewsDecoder: ObservableObject {

    @Published var newsFeed: NewsFeed?
    @Published var hasContent: Bool = false

    init() {
        self.getNews()
    }

    func getNews() {
        let urlString = "http://example.com/feed/json_news/all.json"
        let url = URL(string: urlString)

        guard url != nil else {
            return
        }

        let dataTask = URLSession.shared.dataTask(with: url!) { (data, response, error) in
            DispatchQueue.main.async {
                if error == nil && data != nil {
                    let decoder = JSONDecoder()
                    do {
                        self.newsFeed = try decoder.decode(NewsFeed.self, from: data!)
                        self.hasContent = true
                    } catch {
                        print("Error: \(error)")
                    }
                }
            }
        }

        dataTask.resume()
    }

}

好吧,在 HTTP 协议层中,您没有显式缓存响应。如果后端希望客户端缓存来自 POST 响应的 payload,您稍后可以使用 GET 请求获取该响应,则后端需要相应地设置响应根据 RFC 7231 4.3.3 POST.

,通过指定 Content-Location 响应 header 和关联的缓存控制 header

返回的有效负载在返回的URL中指定了位置,URL与POST的有效请求具有相同的值URL。请阅读 here 以获取更多相关信息。

如果后端已完成此操作,并且您已将 URLSession 配置为在客户端上使用 URLCache,则 URLLoading 机制将缓存负载在“Content-Location”响应中返回的 URL 下 header。

如果您随后使用先前在 Content-Location 响应 header 中返回的给定 URL 发出 GET 请求,缓存机制将生效。

但是,不能保证 POST 缓存在客户端上实现。使用 URLCache 时,值得仔细研究它的行为并检查它是否按预期工作。