簡體   English   中英

如何使用 Vapor Websockets 向客戶端發送字典

[英]How Do I Send a Dictionary to a Client using Vapor Websockets

我在這里繼續這個問題,因為焦點已經改變,但是是相關的。

Vapor 正在服務器和 iOS 客戶端之間進行通信。 只需設置代碼,用於學習目的。

現在,我想使用 JSON 通過已建立的連接發送值字典。 我陷入了演示代碼無法解釋的邏輯中,但這就是我所在的地方,在我的蒸汽路線中:

    app.webSocket("respond") { req, ws in
        ws.onText { ws, text in
            print(text)
        
            let msgDict = "{'name' = 'bobby'}"
            let encoder = JSONEncoder()
            let data = try encoder.encode(msgDict)
                
            ws.send(data)
        }
    }

這將無法編譯: Invalid conversion from throwing function of type '(WebSocket, String) throws -> ()' to non-throwing function type '(WebSocket, String) -> ()'

雖然我通常理解這個錯誤,但取決於我如何處理它,它會有所不同。

通常我正在尋找的是一種簡單的模式來獲取內部字典值,將它們編碼為 JSON,然后發送它們。 我沒有做什么,或者做得不對?

我看到該代碼有兩個問題。

第一個,由編譯錯誤解釋,它實際上告訴它不會處理任何拋出的錯誤。 當您執行encoder.encode(msgDict)時,此代碼可能會引發Error ,並且您不會在任何地方處理此可能的錯誤。 如果您處理該可能的錯誤,您在該閉包中編寫的代碼將具有預期的類型。 您有幾個選項可以這樣做:

  • 將代碼包裹在do-catch塊周圍
do {
    let data = try encoder.encode(msgDict)
    ws.send(data)
} catch let error {
    // Handle error
}
  • 使用try? , 表示如果發生錯誤,您不處理錯誤但結果為nil
if let data = try? encoder.encode(msgDict) {
    ws.send(data)
}
  • 使用try! , 意味着你強制解包結果(不建議,但你可以嘗試,如果你 100% 確定)
let data = try! encoder.encode(msgDict)
ws.send(data)

第二個問題是您如何編寫響應 - "{'name' = 'bobby'}" 這是一個無效的 JSON,您應該使用雙引號代替:

let msgDict = "{\"name\" = \"bobby\"}"

你也可以使用Dictionary ,只要內容是Encodable類型:

let msgDict = ["name": "bobby"]

您還可以使用JSONEncoder對符合Encodable的類的任何實例進行編碼。

所以整個事情,我會這樣寫:

app.webSocket("respond") { req, ws in
    ws.onText { ws, text in
        print(text)
    
        let msgDict = ["name": "bobby"]
        let encoder = JSONEncoder()
        do {
            let data = try encoder.encode(msgDict)
            ws.send(data)
        }
        catch let error {
            print("An error occurred: \(error)")
        }
    }
}

該錯誤告訴您缺少一個do - catch

do {
    let encoder = JSONEncoder()
    let data = try encoder.encode(msgDict)
    ws.send(data)
} catch { print(error) }

但是,您創建 JSON 的方法不起作用,因為msgDict既不是有效的 JSON 也不是 Swift 字典。

要使用JSONEncoder對字典進行編碼,它必須是 Swift 字典

let msgDict = ["name":"bobby"]

但是JSONEncoder是矯枉過正的。 一種更簡單的方法是按字面意思創建 JSON 字典

app.webSocket("respond") { req, ws in
    ws.onText { ws, text in
        print(text)
    
        let msgDict = #"{"name":"bobby"}"#
        ws.send(Data(msgDict.utf8))
    }
}

            
        

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM