Swift 5: данные недействительны JSON (загрузка данных из API в табличное представление) - PullRequest
1 голос
/ 03 марта 2020

Я пытаюсь получить некоторые данные из API. Он прекрасно выбирает данные, когда я подключаю функцию к IBAction, но не работает, когда я выполняю ее в viewDidLoad () как обычная функция.

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

Я получаю сообщение об ошибке «Указанные данные были недействительными JSON» после попытки выполнить функцию из viewDidLoad ()

Ниже приведены коды для справки:

struct Claims: Decodable {
    let id: Int
    let submission_date: String
    let status: String
    init(json: [String:Any]) {
        id = json["id"] as? Int ?? -1
        submission_date = json["submission_date"] as? String ?? ""
        status = json["status"] as? String ?? ""
    }
}

class DashboardController: UIViewController, GIDSignInUIDelegate {

    var claimSummaryArray: [ClaimProperties] = []
    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    override func viewDidLoad() {
        getData()
    }

    func getData() {
        guard let urlString = URL(string: "https://claim.ademo.work/claims/") else { return }
        var requestAPI = URLRequest(url: urlString)

        requestAPI.httpMethod = "GET"
        requestAPI.addValue("application/json", forHTTPHeaderField: "Content-Type")
        requestAPI.addValue("application/json", forHTTPHeaderField: "Accept")
        requestAPI.setValue("Bearer \(appDelegate.userAppToken)", forHTTPHeaderField: "Authorization")

        let task = URLSession.shared.dataTask(with: requestAPI) { (data, response, error) in
            if let data = data {
                do {
                    let json = try JSONDecoder().decode([Claims].self, from: data)
                    print (json)
                } catch let error {
                    print("Seems to have an error: \(error)")
                }
            }
        }
        task.resume()
    }
}

Переменная данных, которая возвращается (выполняется через IBAction / нажатие кнопки):

[ClaimApp.Claims(id: 1, submission_date: "2020-02-28T13:50:41.000+08:00", status: "pending"), ClaimApp.Claims(id: 2, submission_date: "2020-02-28T13:53:38.000+08:00", status: "pending"), ClaimApp.Claims(id: 3, submission_date: "2020-02-28T14:21:46.000+08:00", status: "pending"), ClaimApp.Claims(id: 4, submission_date: "2020-02-28T14:22:07.000+08:00", status: "pending")]

Ошибка, которая возвращается (выполняется посредством вызова нормальной функции из viewDidLoad ()):

Seems to have an error: dataCorrupted(Swift.DecodingError.Context(codingPath: [], debugDescription: "The given data was not valid JSON.", underlyingError: Optional(Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.})))

PS / Я новичок здесь, извиняюсь, если есть какое-либо недопонимание или путаница.

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Я думаю, что ваш appToken недействителен при запуске viewDidLoad. Я вижу, что ваш контроллер - Dashboard, и вы получаете токен из файла, поэтому вы прочитали его asyn c? Поэтому вы должны проверить, что токен уже установлен на appDelegate до DashboardController вызова viewDidLoad. Позвольте отладке или распечатайте журнал, чтобы увидеть, что будет первым.

Если токен установлен после DashboardController call viewDidLoad Я думаю, вам нужно выполнить некоторую загрузку перед вызовом этого контроллера.

0 голосов
/ 03 марта 2020

Пожалуйста, отметьте в viewDidLoad , получаете ли вы значение для userAppToken в строке ниже, которая может истечь, что может вызвать проблему

func getData() {
        guard let urlString = URL(string: "https://claim.ademo.work/claims/") else { return }
        var requestAPI = URLRequest(url: urlString)

        requestAPI.httpMethod = "GET"
        requestAPI.addValue("application/json", forHTTPHeaderField: "Content-Type")
        requestAPI.addValue("application/json", forHTTPHeaderField: "Accept")
        requestAPI.setValue("Bearer \("appDelegate.userAppToken")", forHTTPHeaderField: "Authorization")

        let task = URLSession.shared.dataTask(with: requestAPI) { (data, response, error) in
            if let data = data {
                do {
                    let str = String(decoding: data, as: UTF8.self)
                    print(str) // this is giving message HTTP Token: Access denied.
                    let json = try JSONDecoder().decode([Claims].self, from: data)
                    print (json)
                } catch let error {
                    print(error.localizedDescription)
                    print("Seems to have an error: \(error)")
                }
            }
        }
        task.resume()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...