如何从iOS应用程序中的Node.js服务器获取响应?

问题描述:

我有一个Node.js服务器在用户登录时发送JWT(JSON Web Token)作为响应。如何在我的Swift 4 iOS应用中获得响应?如何从iOS应用程序中的Node.js服务器获取响应?

func handleLogin() { 

    guard let username = usernameTextField.text, let password = 
    passwordTextField.text else { 
     print("Invalid form") 
     return 
    } 

    guard let url = URL(string: "http://localhost:3000/users/authenticate") 
    else { return } 

    var request = URLRequest(url: url) 
    request.httpMethod = "POST" 
    request.addValue("application/json", forHTTPHeaderField: "Content-Type") 

    let authUser = Login(username: username, password: password) 
    do { 
     let jsonBody = try JSONEncoder().encode(authUser) 
     request.httpBody = jsonBody 
    } catch {} 

    let session = URLSession.shared 
    let task = session.dataTask(with: request) 

    task.resume() 
} 

它将用户名和密码发送到服务器,但是我从这里得到响应该怎么办?答复是JWT令牌,以及我如何以及在哪里存储它?

这里是结构。

struct Login: Encodable { 
    let username: String 
    let password: String 
} 

struct User: Decodable { 
    let id: Int 
    let username: String 
    let email: String 
} 

struct Response: Decodable { 
    let token: String 
    let user: User 
} 
+0

而不是空的捕获,打印被捕获的错误;也许你的解码失败了。 – Paulw11

+0

打印'sentPost'是什么? –

+0

你可以发布'loginUser'示例吗?你可以发布样本数据你期望的数据吗? –

立足岗位,荫猜测你的反应会在以下格式:

{ 
    "token": "JWT 2424234234234", 
    "user": { 
     "id": 1, 
     "username": "user.username", 
     "email": "user.email" 
    } 
}  

对于上面的JSON你必须解码象下面这样:

struct Response: Codable { 
    let token: String 
    let user: User 
} 
struct User: Codable { 
    let id: Int 
    let username: String 
    let email: String 
} 

let session = URLSession.shared 
let task = session.dataTask(with: request) { (data, _, _) in 
    guard let data = data else { return } 
    do { 
     let sentPost = try JSONDecoder().decode(Response.self, from: data) 
     print(sentPost.token) 
     print(sentPost.user.id) 
     print(sentPost.user.username) 
     print(sentPost.user.email) 
    } catch {} 
} 
task.resume() 
+0

它没有从服务器获取任何方式,只发送。但是,无论如何谢谢你的结构。 – daniel

+0

您问了另一个问题,因为这会有用 –

let session = URLSession.shared 
    let task = session.dataTask(with: request) { (data, _, _) in 
     guard let data = data else { return } 
     do { 
      let _ = try JSONDecoder().decode(Response.self, from: data) 
     } catch { 
      print(String(data: data, encoding: .utf8)!) 
     } 
    } 
    task.resume() 
+0

您复制了我的答案,然后您接受了答案。 –