无法使用Alamofire检索确切的查询响应

问题描述 投票:0回答:2

我是Swift编程和开发ios应用程序的新手。我正在构建一些能够使用Wordpress API从Wordpress网站检索帖子和其他信息的东西。我使用https://mywebsite.com/wp-json/wp/v2/posts作为端点来获取我需要的数据。我正在使用AlamofireSwiftyJSON来提取数据并在我在UICollectionView中显示信息之前解析。

我正在使用参数来查询API以获取所需的数据。此时基本上过滤帖子。问题是我总是在响应中获得默认号码(前十个帖子)。查询似乎工作正常,因为该网站能够收到确切的查询请求,并按预期响应。但无论出于何种原因,我都无法在Xcode中收到的响应中看到这些数据。它默认为前10个帖子,好像没有应用过滤器或quires。我不知道发生了什么。我一直试图调试它几天没有运气。所以,我在这里张贴,看看是否有人有任何解决这个谜团的想法。

以下是我为此写的功能。

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” “):授权,内容类型,AnyHashable(”x-wp-total“):77,AnyHashable(”日期“):星期五,2019年2月22日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.1Swift 4.2Alamofire (4.8.1)SwiftyJSON (4.2.0)Wordpress V2 API

我在Alamofire请求之后添加了一个断点。附上我看到的截图.Screenshot of the breakpoint

ios swift wordpress alamofire swifty-json
2个回答
0
投票

我猜你的参数在服务器端没有被检测到,因为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])
    }
}

0
投票

我认为在归档项目后,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

© www.soinside.com 2019 - 2024. All rights reserved.