无法使用 Alamofire 检索确切的查询响应
Not able to retrieve the exact queried response using Alamofire
我对 Swift
编程和开发 ios 应用相当陌生。我正在构建一些东西,它将使用 Wordpress API
从 Wordpress 网站检索帖子和其他信息。我使用 https://mywebsite.com/wp-json/wp/v2/posts
作为端点来获取我需要的数据。在 UICollectionView
中显示信息之前,我正在使用 Alamofire
和 SwiftyJSON
提取数据并进行解析。
我正在使用参数查询 API 以获得所需的数据。本质上是在此时过滤帖子。问题是我总是在响应中得到默认数字(前十个帖子)。查询似乎工作正常,因为该网站能够接收到准确的查询请求并按预期进行响应。但无论出于何种原因,我无法在 Xcode 内收到的响应中看到该数据。它默认为前 10 个帖子,就好像没有应用过滤器或查询一样。我不知道发生了什么。我一直在尝试调试它几天,但没有任何运气。所以,我在这里发帖,看看是否有人有解决这个谜团的想法。
以下是我为此编写的函数。
func getPosts() {
Alamofire.request(baseURL, parameters: parameters).responseJSON { (response) -> Void in
if((response.result.value) != nil) {
let postsJson = JSON(response.result.value!)
self.posts = [SitePosts]()
//Testing
print(response.request as Any)
print(response.response?.allHeaderFields)
print("Total posts: \(postsJson.arrayValue.count)")
do {
for posts in postsJson.arrayValue {
let post = SitePosts()
let title = posts["title"]["rendered"].stringValue
let content = posts["content"]["rendered"].stringValue
let url = posts["link"].stringValue
let urlToImage = posts["featured_image_link"].string
post.content = content
post.title = title
post.url = url
post.imageUrl = urlToImage
self.posts?.append(post)
}
DispatchQueue.main.async {
self.postsCollectionView.reloadData()
}
}
}
}
}
以下是发送到 API
的响应请求
[AnyHashable("wpe-backend"): apache, AnyHashable("Server"): nginx,
AnyHashable("x-type"): default, AnyHashable("x-cacheable"): bot,
AnyHashable("allow"): GET, AnyHashable("x-cache"): HIT: 2,
AnyHashable("Cache-Control"): max-age=10800, must-revalidate,
AnyHashable("Content-Encoding"): gzip, AnyHashable("x-cache-group"):
bot, AnyHashable("x-pass-why"): ,
AnyHashable("access-control-expose-headers"): X-WP-Total,
X-WP-TotalPages, AnyHashable("x-wp-totalpages"): 8,
AnyHashable("Content-Type"): application/json; charset=UTF-8,
AnyHashable("x-content-type-options"): nosniff,
AnyHashable("Expires"): Thu, 19 Nov 1981 08:52:00 GMT,
AnyHashable("access-control-allow-headers"): Authorization,
Content-Type, AnyHashable("x-wp-total"): 77, AnyHashable("Date"): Fri,
22 Feb 2019 22:46:42 GMT, AnyHashable("Link"):
https://mywebsite.com/wp-json/wp/v2/posts?page=2; rel="next",
AnyHashable("x-robots-tag"): noindex]
我正在使用 Xcode 10.1
、Swift 4.2
、Alamofire (4.8.1)
、SwiftyJSON (4.2.0)
和 Wordpress V2 API
。
我在 Alamofire 请求之后添加了一个断点。附上我看到的截图。Screenshot of the breakpoint
我猜由于不同的 API 方法动词 (POST, GET),服务器端未检测到您的参数。尝试关注
class BaseAPIsCaller: NSObject {
static func post(url:String,parameters:Parameters,_ completion:@escaping (Data?,NSError?)->Void){
let request =
Alamofire.request(url, method: .post, parameters: parameters,
encoding: JSONEncoding.default)
request.responseJSON { response in
guard response.result.error == nil else {
completion(nil,NSError(response.result.error!.localizedDescription))
return
}
guard (response.result.value as? [String: Any]) != nil else {
completion(nil,NSError("Didn't get json object"))
return
}
completion(response.data!,nil)
}
}
}
然后在任何地方使用此方法,如:
func getPosts()->Void{
BaseAPIsCaller.post(url:"https://mywebsite.com/wp-json/wp/v2/posts", parameters: [:]) { (data:Data?, error:NSError?) in
if let data = data {
let json = JSON(data)
print(json)
}else{
print(error!.localizedDescription)
}
}
}
注意:我使用的是 NSError 扩展
extension NSError{
public convenience init(_ message:String) {
self.init(domain: "network_error", code: -529, userInfo: [NSLocalizedDescriptionKey:message])
}
}
我认为归档项目后 Alamofire 包出现问题。我尝试重新创建该项目并且它运行良好,直到我将该项目存档以在另一台设备上进行测试。所以,我已经切换到 urlRequest 而不是使用 Alamofire 请求。用下面的替换 Alamofire 请求对我来说很好。
var urlRequest = URLRequest(url: URL(string: "https://mywesite.com/wp-json/wp/v2/posts?per_page=100")!)
let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in
我对 Swift
编程和开发 ios 应用相当陌生。我正在构建一些东西,它将使用 Wordpress API
从 Wordpress 网站检索帖子和其他信息。我使用 https://mywebsite.com/wp-json/wp/v2/posts
作为端点来获取我需要的数据。在 UICollectionView
中显示信息之前,我正在使用 Alamofire
和 SwiftyJSON
提取数据并进行解析。
我正在使用参数查询 API 以获得所需的数据。本质上是在此时过滤帖子。问题是我总是在响应中得到默认数字(前十个帖子)。查询似乎工作正常,因为该网站能够接收到准确的查询请求并按预期进行响应。但无论出于何种原因,我无法在 Xcode 内收到的响应中看到该数据。它默认为前 10 个帖子,就好像没有应用过滤器或查询一样。我不知道发生了什么。我一直在尝试调试它几天,但没有任何运气。所以,我在这里发帖,看看是否有人有解决这个谜团的想法。
以下是我为此编写的函数。
func getPosts() {
Alamofire.request(baseURL, parameters: parameters).responseJSON { (response) -> Void in
if((response.result.value) != nil) {
let postsJson = JSON(response.result.value!)
self.posts = [SitePosts]()
//Testing
print(response.request as Any)
print(response.response?.allHeaderFields)
print("Total posts: \(postsJson.arrayValue.count)")
do {
for posts in postsJson.arrayValue {
let post = SitePosts()
let title = posts["title"]["rendered"].stringValue
let content = posts["content"]["rendered"].stringValue
let url = posts["link"].stringValue
let urlToImage = posts["featured_image_link"].string
post.content = content
post.title = title
post.url = url
post.imageUrl = urlToImage
self.posts?.append(post)
}
DispatchQueue.main.async {
self.postsCollectionView.reloadData()
}
}
}
}
}
以下是发送到 API
的响应请求[AnyHashable("wpe-backend"): apache, AnyHashable("Server"): nginx, AnyHashable("x-type"): default, AnyHashable("x-cacheable"): bot, AnyHashable("allow"): GET, AnyHashable("x-cache"): HIT: 2, AnyHashable("Cache-Control"): max-age=10800, must-revalidate, AnyHashable("Content-Encoding"): gzip, AnyHashable("x-cache-group"): bot, AnyHashable("x-pass-why"): , AnyHashable("access-control-expose-headers"): X-WP-Total, X-WP-TotalPages, AnyHashable("x-wp-totalpages"): 8, AnyHashable("Content-Type"): application/json; charset=UTF-8, AnyHashable("x-content-type-options"): nosniff, AnyHashable("Expires"): Thu, 19 Nov 1981 08:52:00 GMT, AnyHashable("access-control-allow-headers"): Authorization, Content-Type, AnyHashable("x-wp-total"): 77, AnyHashable("Date"): Fri, 22 Feb 2019 22:46:42 GMT, AnyHashable("Link"): https://mywebsite.com/wp-json/wp/v2/posts?page=2; rel="next", AnyHashable("x-robots-tag"): noindex]
我正在使用 Xcode 10.1
、Swift 4.2
、Alamofire (4.8.1)
、SwiftyJSON (4.2.0)
和 Wordpress V2 API
。
我在 Alamofire 请求之后添加了一个断点。附上我看到的截图。Screenshot of the breakpoint
我猜由于不同的 API 方法动词 (POST, GET),服务器端未检测到您的参数。尝试关注
class BaseAPIsCaller: NSObject {
static func post(url:String,parameters:Parameters,_ completion:@escaping (Data?,NSError?)->Void){
let request =
Alamofire.request(url, method: .post, parameters: parameters,
encoding: JSONEncoding.default)
request.responseJSON { response in
guard response.result.error == nil else {
completion(nil,NSError(response.result.error!.localizedDescription))
return
}
guard (response.result.value as? [String: Any]) != nil else {
completion(nil,NSError("Didn't get json object"))
return
}
completion(response.data!,nil)
}
}
}
然后在任何地方使用此方法,如:
func getPosts()->Void{
BaseAPIsCaller.post(url:"https://mywebsite.com/wp-json/wp/v2/posts", parameters: [:]) { (data:Data?, error:NSError?) in
if let data = data {
let json = JSON(data)
print(json)
}else{
print(error!.localizedDescription)
}
}
}
注意:我使用的是 NSError 扩展
extension NSError{
public convenience init(_ message:String) {
self.init(domain: "network_error", code: -529, userInfo: [NSLocalizedDescriptionKey:message])
}
}
我认为归档项目后 Alamofire 包出现问题。我尝试重新创建该项目并且它运行良好,直到我将该项目存档以在另一台设备上进行测试。所以,我已经切换到 urlRequest 而不是使用 Alamofire 请求。用下面的替换 Alamofire 请求对我来说很好。
var urlRequest = URLRequest(url: URL(string: "https://mywesite.com/wp-json/wp/v2/posts?per_page=100")!)
let task = URLSession.shared.dataTask(with: urlRequest) { (data,response,error) in