ios - 解析 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)")
}
})
}
}
解决方案
推荐阅读
- php - 我对 PHPMailer 包有疑问
- java - 在java中传递一个func条件
- doxygen - 非法别名格式“ALIASES”
- swing - IntelliJ插件,复用系统形式
- c# - 将项目升级到目标 .net 框架到 4.7.2,而不升级 nuget 引用
- ruby-on-rails - 设计 gem `const_get':未初始化的常量 Devise::Models::RemoteAuthenticatable (NameError)
- javascript - 将多个 JS 文件添加到 Angular 中?
- wpf - WPF ScrollViewer 更改 TextBlock 宽度
- c++ - pugiXML 将现有节点附加到文档中
- json - PayPal 传入 JSON 请求未映射到 API 请求