[英]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.