将 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 时,值得仔细研究它的行为并检查它是否按预期工作。
我有一个对象,其中包含使用 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 时,值得仔细研究它的行为并检查它是否按预期工作。