Невозможно получить точный запрошенный ответ, используя Alamofire - PullRequest
0 голосов
/ 23 февраля 2019

Я довольно новичок в Swift программировании и разработке приложений для ios.Я создаю что-то, что будет собирать сообщения и другую информацию с веб-сайта Wordpress, используя Wordpress API.Я использую https://mywebsite.com/wp-json/wp/v2/posts в качестве конечной точки для получения нужных мне данных.Я работаю с Alamofire и SwiftyJSON, чтобы получить данные и проанализировать, прежде чем отобразить информацию в UICollectionView.

Я использую параметры для запроса 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 ("Сервер"): nginx, AnyHashable ("x-type"): по умолчанию, 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»): четверг, 19 ноября 1981 г. 08:52:00 GMT, AnyHashable («access-control-allow-headers»"): Авторизация, Content-Type, AnyHashable (" x-wp-total "): 77, AnyHashable (" Date "): пт, 22 фев. 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.Прикрепление скриншота того, что я вижу. Скриншот точки останова

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Я думаю, что-то происходит с пакетом Alamofire после архивации проекта.Я пытался воссоздать проект, и он работал нормально, пока я не заархивировал проект для тестирования на другом устройстве.Итак, я переключился на urlRequest вместо того, чтобы использовать запрос Alamofire.Замена запроса Alamofire на приведенный ниже работала нормально для меня.

var urlRequest = URLRequest (url: URL (строка: "https://mywesite.com/wp-json/wp/v2/posts?per_page=100")!)

let task = URLSession.shared.dataTask (with: urlRequest)) {(данные, ответ, ошибка) в

0 голосов
/ 23 февраля 2019

Я полагаю, что ваши параметры не обнаруживаются на стороне сервера из-за другого глагола метода 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])
    }
}
...