繁体   English   中英

Swift4-错误域= NSCocoaErrorDomain代码= 4865

[英]Swift4 - Error Domain=NSCocoaErrorDomain Code=4865

func DoLogin(_ email:String, _ password:String)
{

        struct user : Decodable {
            let userid: Int
            let sfname: String
            let slname: String
            let email: String
            let sid: Int
        }


    let url = URL(string: ".....")!
    var request = URLRequest(url: url)
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type")
    request.httpMethod = "POST"
    let postString = "email=" + email + "&password=" + password + ""
    request.httpBody = postString.data(using: .utf8)
    let task = URLSession.shared.dataTask(with: request) { data, response, error in
        guard let data = data, error == nil else {                                                 // check for fundamental networking error
            print(error!)
            return
        }

        if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
            print("statusCode should be 200, but is \(httpStatus.statusCode)")
            print(response!)
        }

       let responseString = String(data: data, encoding: .utf8)
     print(responseString!)
        do {
            let myStruct = try JSONDecoder().decode(user.self, from: data)
            print(myStruct)


        } catch let error as NSError {
            print(error)

        }
    }


    task.resume()
}

因此,目标是将JSON响应保存到“用户”类中,以便我可以使用变量将数据插入sql数据库。 我目前遇到的问题是错误消息...

“错误域= NSCocoaErrorDomain代码= 4865”没有与键userid(“ userid”)关联的值。“ UserInfo = {NSCodingPath =(),NSDebugDescription =没有与键userid(” userid“)关联的值。}”

我认为问题在于HTTP响应以数组形式返回数据,该数据随后无法被解码(下面列出的HTTP响应是我一直用于测试目的的responseString)

{"user":{"userid":2,"sfname":"John","slname":"Doe","email":"john@doe.com","sid":123456}}

这是用于返回数据的PHP。

    public function getUserByEmail($email)
{
    $stmt = $this->conn->prepare("SELECT userid, sfname, slname, email, sid FROM students WHERE email = ?");
    $stmt->bind_param("s", $email);
    $stmt->execute();
    $stmt->bind_result($userid, $sfname, $slname, $email, $sid);
    $stmt->fetch();
    $user = array();
    $user['userid'] = $userid;
    $user['sfname'] = $sfname;
    $user['slname'] = $slname;
    $user['email'] = $email;
    $user['sid'] = $sid;
    return $user;
}

提前致谢

正如您已经提到的那样,JSON的结构与user结构的结构不匹配。

您可以做两件事:尝试弄清为什么将返回的JSON包装在另一个JSON对象中,或者创建一个与接收的JSON结构匹配的包装器结构。

第二种方法应产生如下结果:

struct UserWrapper: Decodable {
  let user:user
}

然后,当您从JSON创建用户时,只需

let wrapper = try JSONDecoder().decode(UserWrapper.self, from: data)
myStruct = wrapper.user

顺便说一句:我建议您阅读Swift风格指南。 按照约定,函数名称应以小写字母开头,而类/结构名称应以大写字母开头。 在函数中也命名为参数的文档是很酷的事情。

就像是

func doLogin(userWithMail email: String, andPassword password: String) {...}
// ... other stuff
// call
doLogin(userWithMail: "test@test.com", andPassword: "1234567")

可能更具可读性。 以防万一您将来必须共享您的代码库。 ; d

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM