循环更新 URL 的 API 请求
Loop over an API request updating the URL
我正在使用 GoogleMaps API,这 return 附近有 20 个位置,最多可以 return 编辑 60 个位置。这些位置 return 使用 nextPageToken 编辑,它允许您获取下一页结果(每页 20 个)。我正在尝试遍历 API 以使自己能够获得所有可用位置,但遇到困难:
func getAllNearbyLocations(url: URL) {
我正在使用 Alamofire return API 请求(我也尝试过使用 URLSessions)
首先,我在完成块return中创建了一个json字典的函数
// This function returns the JSON from a specific URL
func getJsonFromURL(url: URL, completionHandler: @escaping (NSDictionary) -> ()) {
Alamofire.request(url).responseJSON { response in
let json = response.result.value as! NSDictionary
completionHandler(json)
}
}
接下来我们有一个 getNearByLocation 函数,我们用 url 初始化它。如您所见,我们 return 结果,将它们添加到数组中,检查我们是否有最大数量的结果 (60) 或不再有 nextPageToken。如果其中任何一个为假,我们将创建新的 URL 并再次触发我们当前所在的函数。当我们 return 所有新位置时,循环结束。
func getAllNearbyLocations(url: URL) {
self.getJsonFromURL(url: url) { (dictionary) in
let newLocations: NSArray = dictionary.value(forKey: "results") as! NSArray
self.locations.addObjects(from: newLocations as! [Any])
if self.locations.count >= 60 {
self.sendNewLocations(locations: self.locations)
}
else {
// We want to now update the URL we are using and search again
if let newPageToken = dictionary["next_page_token"] {
let newURL = self.rootSearchURL + "&pagetoken=" + (newPageToken as! String)
let url = URL(string: newURL)
// We want to get our current URL and remove the last characters from it
self.getAllNearbyLocations(url: url!)
}
else {
// If we have no more pages then we return what we have
self.sendNewLocations(locations: self.locations)
}
}
}
}
奇怪的是,当我使用断点测试代码时,它 return 符合预期。它遍历函数,添加所有新位置和 returns。当我 运行 它实时 returned 字典不 return 正确(不包含位置或下一页标记)所以我的功能只有 returns前 20 个位置。
我以前使用过 API 个请求,但从来没有如此连续地使用过。我觉得这是一个陷阱 22,因为在我调用请求之前我无法知道新的 pageToken,一旦我 return 编辑了请求,我想立即使用该令牌调用请求。
根据 Documentation、
There is a short delay between when a next_page_token is issued, and when it will become valid. Requesting the next page before it is available will return an INVALID_REQUEST response. Retrying the request with the same next_page_token will return the next page of results.
尝试检查使用 new_page_token
检索数据时得到的结果
尝试这样调用:
let newURL = self.rootSearchURL + "&pagetoken=" + (newPageToken as! String)
let url = URL(string: newURL)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
// We want to get our current URL and remove the last characters from it
self.getAllNearbyLocations(url: url!)
}
我正在使用 GoogleMaps API,这 return 附近有 20 个位置,最多可以 return 编辑 60 个位置。这些位置 return 使用 nextPageToken 编辑,它允许您获取下一页结果(每页 20 个)。我正在尝试遍历 API 以使自己能够获得所有可用位置,但遇到困难: func getAllNearbyLocations(url: URL) {
我正在使用 Alamofire return API 请求(我也尝试过使用 URLSessions)
首先,我在完成块return中创建了一个json字典的函数
// This function returns the JSON from a specific URL
func getJsonFromURL(url: URL, completionHandler: @escaping (NSDictionary) -> ()) {
Alamofire.request(url).responseJSON { response in
let json = response.result.value as! NSDictionary
completionHandler(json)
}
}
接下来我们有一个 getNearByLocation 函数,我们用 url 初始化它。如您所见,我们 return 结果,将它们添加到数组中,检查我们是否有最大数量的结果 (60) 或不再有 nextPageToken。如果其中任何一个为假,我们将创建新的 URL 并再次触发我们当前所在的函数。当我们 return 所有新位置时,循环结束。
func getAllNearbyLocations(url: URL) {
self.getJsonFromURL(url: url) { (dictionary) in
let newLocations: NSArray = dictionary.value(forKey: "results") as! NSArray
self.locations.addObjects(from: newLocations as! [Any])
if self.locations.count >= 60 {
self.sendNewLocations(locations: self.locations)
}
else {
// We want to now update the URL we are using and search again
if let newPageToken = dictionary["next_page_token"] {
let newURL = self.rootSearchURL + "&pagetoken=" + (newPageToken as! String)
let url = URL(string: newURL)
// We want to get our current URL and remove the last characters from it
self.getAllNearbyLocations(url: url!)
}
else {
// If we have no more pages then we return what we have
self.sendNewLocations(locations: self.locations)
}
}
}
}
奇怪的是,当我使用断点测试代码时,它 return 符合预期。它遍历函数,添加所有新位置和 returns。当我 运行 它实时 returned 字典不 return 正确(不包含位置或下一页标记)所以我的功能只有 returns前 20 个位置。
我以前使用过 API 个请求,但从来没有如此连续地使用过。我觉得这是一个陷阱 22,因为在我调用请求之前我无法知道新的 pageToken,一旦我 return 编辑了请求,我想立即使用该令牌调用请求。
根据 Documentation、
There is a short delay between when a next_page_token is issued, and when it will become valid. Requesting the next page before it is available will return an INVALID_REQUEST response. Retrying the request with the same next_page_token will return the next page of results.
尝试检查使用 new_page_token
尝试这样调用:
let newURL = self.rootSearchURL + "&pagetoken=" + (newPageToken as! String)
let url = URL(string: newURL)
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
// We want to get our current URL and remove the last characters from it
self.getAllNearbyLocations(url: url!)
}