无法使用Alamofire

时间:2019-02-22 23:14:45

标签: ios swift wordpress alamofire swifty-json

我对Swift编程和开发ios应用程序还很陌生。我正在构建一些东西,它将使用Wordpress API从Wordpress网站检索帖子和其他信息。我使用https://mywebsite.com/wp-json/wp/v2/posts作为端点来获取所需的数据。在AlamofireSwiftyJSON中显示信息之前,我正在使用UICollectionViewfunc 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以获取所需的数据。目前基本上是过滤帖子。问题是我总是在响应中获得默认号码(前十个帖子)。该查询似乎工作正常,因为该网站能够接收确切的查询请求并正在按预期方式进行响应。但是无论出于什么原因,我都无法在Xcode内部收到的响应中看到该数据。默认情况下,前10个帖子就好像没有应用任何过滤器或查询一样。我不知道发生了什么事。我一直在调试它几天,没有任何运气。所以,我要在这里发布消息,看看是否有人对解决这个奥秘有任何想法。

以下是我为此编写的函数。

Xcode 10.1

以下是已发送到API的响应请求

  

[AnyHashable(“ wpe-backend”):apache,AnyHashable(“ Server”):nginx,   AnyHashable(“ x-type”):默认; AnyHashable(“ x-cacheable”):漫游器,   AnyHashable(“ allow”):GET,AnyHashable(“ x-cache”):HIT:2,   AnyHashable(“ Cache-Control”):max-age = 10800,必须重新验证,   AnyHashable(“ Content-Encoding”):gzip,AnyHashable(“ x-cache-group”):   机器人,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”):格林尼治标准时间1981年11月19日星期四,   AnyHashable(“ access-control-allow-headers”):授权,   Content-Type,AnyHashable(“ x-wp-total”):77,AnyHashable(“ Date”):周五,   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]

我正在使用Swift 4.2Alamofire (4.8.1)SwiftyJSON (4.2.0)Wordpress V2 APIjoin

我在Alamofire请求之后添加了一个断点。附上我所见的屏幕截图。Screenshot of the breakpoint

2 个答案:

答案 0 :(得分: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

extension NSError{
    public convenience init(_ message:String) {
        self.init(domain: "network_error", code: -529, userInfo: [NSLocalizedDescriptionKey:message])
    }
}

答案 1 :(得分: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)