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

Posted

技术标签:

【中文标题】如何从 iOS 应用程序中的 Node.js 服务器获取响应?【英文标题】:How do i get the response from Node.js server in iOS app? 【发布时间】:2017-10-21 20:21:29 【问题描述】:

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

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

【问题讨论】:

打印捕获的错误而不是空捕获;也许你的解码失败了。 它在打印什么sentPost 您可以发布loginUser 示例吗?您可以发布您对数据的期望的示例数据吗? 你能发布你期望的数据样本格式吗? 它不存在。你说你期待令牌。 【参考方案1】:

根据帖子,我猜您的回复将采用以下格式:


    "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()

【讨论】:

这种方式不会从服务器获取任何东西,只会发送。不过还是谢谢你的结构。 你问对了另一个问题,因为这很有用【参考方案2】:
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()

【讨论】:

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

以上是关于如何从 iOS 应用程序中的 Node.js 服务器获取响应?的主要内容,如果未能解决你的问题,请参考以下文章

如何将二进制数据从 Node.js socket.io 服务器发送到浏览器客户端?

为啥我的 Auth0 令牌从 iOS 发送到 node.js 服务器时总是返回无效?

从 C# 程序连接基于 node.js 的 socket.io WebSocket 服务器

如何在Node.js中执行IO任务序列[重复]

如何将数据从 Android 中的数据报套接字发送到 Node js 服务器?

Node.js - 如何从 app.js 外部发出 socket.io 事件?