首页 > 解决方案 > 解析 JSON 时出现 Rest API 后解码问题

问题描述

我正在尝试使用 REST API 向用户发送消息并获取验证码以快速验证用户但每次我在模拟器上尝试时都会出现错误并且控制台会打印错误消息“解码问题”但是发送方法(帖子)正在工作,所以我可以收到一条消息。我只是不知道我的信息是否在服务器上有效

请告诉我为什么会出现解码问题以及如何解决

共有三个代码文件。第一个是请求 API 的模型第二个是我要发布到服务器的消息信息,最后一个是检查 API 是否正常运行的控制器


import Foundation

enum APIError: Error{
    case responseProblem
    case decodingProblem
    case encodingProblem
}

struct APIRequest {
    let resourceURL: URL

    init(endPoint: String) {
        let resourceString = "https://wageul.heewon.dev/api\(endPoint)"
        guard let resURL = URL(string: resourceString) else{fatalError()}

        self.resourceURL = resURL
    }

    func save(_ messegeToSave: Messege, completion: @escaping(Result<Messege,APIError>) -> Void) {
        do{
            var urlRequest = URLRequest(url: resourceURL)
            urlRequest.httpMethod = "POST"
            urlRequest.addValue("application/json", forHTTPHeaderField: "Content-type")
            urlRequest.httpBody = try JSONEncoder().encode(messegeToSave)

            let dataTask = URLSession.shared.dataTask(with: urlRequest) { data,response, _ in
                guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200, let jsonData = data else{
                    completion(.failure(.responseProblem))
                    return
                }

                do{
                    let messegeData = try JSONDecoder().decode(Messege.self, from: jsonData)
                    completion(.success(messegeData))
                }catch{
                    completion(.failure(.decodingProblem))
                }
            }
            dataTask.resume()
        }catch{
            completion(.failure(.encodingProblem))
        }

    }

}


import Foundation

class Messege: Codable{
    var phone: String
    var code: String?

    init(phone: String) {
        self.phone = phone
        self.code = nil
    }

    init(phone: String, code: String) {
        self.phone = phone
        self.code = code
    }
}

import Foundation
import UIKit
class PhoneNumCheckController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }


    @IBOutlet weak var codeText: UITextField!

    @IBAction func phoneNumCheckButton(_ sender: UIButton) {

        let tempPhoneNum = UserDefaults.standard.value(forKey: "tempPhoneNum") as! String

        let messege = Messege(phone: tempPhoneNum, code:codeText.text!)

        let postRequest = APIRequest(endPoint: "/register")
        postRequest.save(messege, completion: { result in
            switch result{
            case .success(let messege):
                print("Messege Sent: \(messege)")
            case .failure(let error):
                print("Error Occured: \(error)")
            }
        })
    }


}

标签: iosswift

解决方案


推荐阅读