首页 文章

Swift4中的POST方法urlSession可解码无法正常工作(这里出了什么问题?)

提问于
浏览
0

我试图发布2个参数(电子邮件:和密码)从服务器获取具有详细用户信息的响应,我构建API来处理这个并使用Postman获得良好的响应,但是当我尝试用Swift4实现这个新的urlsession时JSON解码和编码,它一直失败,我在解码响应数据时遇到错误 . 这是我使用Postman时的JSON响应:

{
    "error": "false",
    "message": "downloaded",
    "UserInfo": {
        "id": 5,
        "email": "abc@hotmail.com",
        "lastname": "Bence",
        "name": "Mark",
        "phone": "1234567",
        "add1": "333",
        "add2": "444",
        "city": "ott",
        "postalcode": "tttttt"
    }
}

我的struct文件:

import UIKit
struct loginPost: Encodable {
    let email: String
    let password: String
}

struct User: Decodable {
    let error: String?
    let message: String?
    let UserInfo: [UserData]

    }

struct UserData: Codable {
    let  id: Int?
    let email: String?
    let lastname: String?
    let name: String?
    let phone: String?
    let add1: String?
    let add2: String?
    let city: String
    let postalcode: String?


}

My Function

func downloadJson() {

     let url = URL(string: http://192.168.0.10/api/login_hashed.php)
    guard let downloadURL = url else { return }
    //POST Req


    var request = URLRequest(url: downloadURL)
    request.httpMethod = "POST"
    request.addValue("application/json", forHTTPHeaderField: "Content-Type")
    request.addValue("application/json", forHTTPHeaderField: "Accept")
    let newpost = loginPost(email: "abc@hotmail.com", password: "123456")

    do {
        let jsonBody = try JSONEncoder().encode(newpost)

        request.httpBody = jsonBody
        print(jsonBody)
    }catch{
        print("some error")
    }


    URLSession.shared.dataTask(with: request) { data, urlResponse, error in
        guard let data = data, error == nil, urlResponse != nil else {
            print("something is wrong with url")
            return
        }

        print("downloaded..")
        do
        {
            let decoder = JSONDecoder()
            let downloaduser = try decoder.decode(User.self, from: data)
            self.logmessage = downloaduser.message!

            print(self.logmessage)


            DispatchQueue.main.async {

               // self.tableView.reloadData()
            }
        } catch {
            print("something wrong with decode")

        }
        }.resume() 
}

1 回答

  • 0

    我终于弄明白了,谢谢 . 我只是想提一下这个错误的原因并分享我的经验 . 主要原因是您发送JSON并接收传入响应的方式 . 您应该确切地知道数据的外观,以便以可接受的方式创建结构 . 我的返回数据只是简单的2行文本和文本数组,我的结构是:

    import UIKit
    struct loginPost: Encodable {
        let email: String
        let password: String
    }
    
    struct User: Decodable {
        let error: String?
        let message: String?
        let UserInfo: [UserData]
    
        }
    
    struct UserData: Codable {
        let  id: Int?
        let email: String?
        let lastname: String?
        let name: String?
        let phone: String?
        let add1: String?
        let add2: String?
        let city: String
        let postalcode: String?
    
    
    }
    

    我在第18行的错误

    let UserInfo: [UserData]
    

    它应该是

    let UserInfo: UserData?
    

    没有方括号 . 更重要的一点,总是尝试捕获解码错误,并通过实现} catch let JsonErr {,它将为您提供解码无效的原因 .

    在我的情况下:

    下载了一些错误的下载后的typeMismatch(Swift.Array,Swift.DecodingError.Context(codingPath:[h2h.User . (CodingKeys in _E33F61CC43E102744E4EF1B7E9D7EDDE).UserInfo],debugDescription:“预计会解码数组,但会找到一个字典 . ” ,underlyingError:nil))

    并确保使您的服务器API接受JSON格式的application / json并解码您发送的内容以便接收您要查找的内容; php代码服务API

    $UserData = json_decode(file_get_contents("php://input"), true);
    

相关问题