- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用一个 API,该 API 在一个名为 Link 的字段内为我提供页眉中的下一页。 (例如 Github 也是这样做的,所以这并不奇怪。Github Doc )
我正在使用的服务通过以下方式检索分页数据: 正如我们在“链接”中看到的那样,给我下一页,与 $0.response?.allHeaderFields["Link"]
:我得到</api/games?page=1&size=20>; rel="next",</api/games?page=25&size=20>; rel="last",</api/games?page=0&size=20>; rel="first"
.
我找到了下面的代码来读取页面,但是它很脏......我想知道是否有人处理过同样的问题或者是否有一种标准的方式来面对它。 (我也搜索过 alamofire 是否支持任何类型的功能,但我还没有找到)
// MARK: - Pagination
private func getNextPageFromHeaders(response: NSHTTPURLResponse?) -> String? {
if let linkHeader = response?.allHeaderFields["Link"] as? String {
/* looks like:
<https://api.github.com/user/20267/gists?page=2>; rel="next", <https://api.github.com/user/20267/gists?page=6>; rel="last"
*/
// so split on "," the on ";"
let components = linkHeader.characters.split {$0 == ","}.map { String($0) }
// now we have 2 lines like '<https://api.github.com/user/20267/gists?page=2>; rel="next"'
// So let's get the URL out of there:
for item in components {
// see if it's "next"
let rangeOfNext = item.rangeOfString("rel=\"next\"", options: [])
if rangeOfNext != nil {
let rangeOfPaddedURL = item.rangeOfString("<(.*)>;", options: .RegularExpressionSearch)
if let range = rangeOfPaddedURL {
let nextURL = item.substringWithRange(range)
// strip off the < and >;
let startIndex = nextURL.startIndex.advancedBy(1) //advance as much as you like
let endIndex = nextURL.endIndex.advancedBy(-2)
let urlRange = startIndex..<endIndex
return nextURL.substringWithRange(urlRange)
}
}
}
}
return nil
}
最佳答案
我认为 forEach()
可能有更好的解决方案,但这是我得到的:
let linkHeader = "</api/games?page=1&size=20>; rel=\"next\",</api/games?page=25&size=20>; rel=\"last\",</api/games?page=0&size=20>; rel=\"first\""
let links = linkHeader.components(separatedBy: ",")
var dictionary: [String: String] = [:]
links.forEach({
let components = $0.components(separatedBy:"; ")
let cleanPath = components[0].trimmingCharacters(in: CharacterSet(charactersIn: "<>"))
dictionary[components[1]] = cleanPath
})
if let nextPagePath = dictionary["rel=\"next\""] {
print("nextPagePath: \(nextPagePath)")
}
//Bonus
if let lastPagePath = dictionary["rel=\"last\""] {
print("lastPagePath: \(lastPagePath)")
}
if let firstPagePath = dictionary["rel=\"first\""] {
print("firstPagePath: \(firstPagePath)")
}
控制台输出:
$> nextPagePath: /api/games?page=1&size=20
$> lastPagePath: /api/games?page=25&size=20
$> firstPagePath: /api/games?page=0&size=20
我用了components(separatedBy:)
而不是 split()
避免 String()
转换在最后。我创建了一个 Dictionary
对于要保留的值并删除了 <
和 >
带修剪。
关于Swift 从 NSHTTPURLResponse 的标题中获取下一页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51088747/
根据苹果... https://developer.apple.com/library/content/samplecode/URLCache/Listings/Classes_URLCacheCon
我正在使用一个 API,该 API 在一个名为 Link 的字段内为我提供页眉中的下一页。 (例如 Github 也是这样做的,所以这并不奇怪。Github Doc ) 我正在使用的服务通过以下方式检
我在 HTTP header 中使用 if-modified-since 来决定是否应该下载文件。应用程序已经过测试,一切正常,但现在当我询问我的 NSHTTPURLResponse 实例 respo
如果我使用 NSURLConnection 从服务器获取数据并且它发回以以下内容开头的响应: HTTP/1.1 406 这里有一些文本字符串 有什么方法可以检索状态文本“此处有一些文本字符串”?我知道
我正在使用 web 服务,当由于验证原因而失败时,错误消息在 StatusDescription 中。我需要一种方法来获取它并将其显示给用户,但我在 NSHTTPURLResponse 上看到的只是
我需要修改 NSURLResponse 中的响应 header 。这可能吗? 最佳答案 我刚刚和一个 friend 讨论过这个问题。我的建议是编写 NSURLResponse 的子类。大致如下: @i
请原谅我问这个愚蠢的问题,但是有人可以告诉我 NSURLResponse 和 NSHTTPURLResponse 之间有什么区别 最佳答案 "NSURLResponse declares the pr
我正在尝试返回变量 statusCode,该变量应该采用 NSHTTPURLResponse 的 statusCode 属性的值,但是即使我检查并看到数据已成功发布,我也得到零。它返回我初始化变量的
我有一个名为 APIManager 的类的扩展: import Alamofire import Foundation // MARK: - Logout extension APIManager {
我有一个有趣的问题:当我的设备处于飞行模式时,NSHHTPURLResponse 提供的 HTTP 状态代码是 200“OK”。 它不应该因错误而失败,或者至少不响应它与代码 200 的有效连接吗?
是否可以在不使用该方法的情况下修改 NSHTTPURLResponse 上的 header initWithURL:statusCode:HTTPVersion:headerFields: 创建一个新
为什么 -[[NSHTTPURLResponse allHeaderFields] valueForKey:] 不区分大小写,而手动创建的 NSDictionary 的 valueForKey: 不区
我看过很多代码,包括 Apple 的 SimpleURLConnections 示例,它们只是将任何 NSURLResponse 转换为 NSHTTPURLResponse。如果它始终是 NSHTTP
我正在尝试阅读 NSHTTPURLResponse状态代码,但是 NSHTTPURLResponse返回零,但没有 NSError已创建。 这在 iOS 11 之前有效,但我没有收到关于它已被弃用的警
我正在使用 OCMock 来模拟 NSURLConnection/NSURLResponse(是的,我知道这些已被弃用)并且一切正常,因为我希望它模拟 http 响应代码和 http 主体。现在我正在
这个问题在这里已经有了答案: How can I get the Data from NSURLSession.sharedSession().dataTaskWithRequest (2 个答案)
我有这段代码: let task = session.dataTaskWithRequest(request, completionHandler: { (data, response, error)
我正在尝试从 URL 获取 JSON 文件并使用 Swift 返回内容。但是,代码在 let httpResponse = response as! 行失败。以下代码中的 NSHTTPURLRespo
我有一个非常奇怪的问题,我正在请求一个 URL,我想从中获取 cookie,我使用这种方式获取 cookie: - (void)connection:(NSURLConnection *)connec
无法调用非函数类型“NSHTTPURLResponse?”的值? 有人可以帮我吗? 这是代码 public func responseObject(queue: dispatch_queue_t
我是一名优秀的程序员,十分优秀!