我正在尝试在 Swift 中创建一个 URL 请求,以将 HTTP POST 请求发送到 Discord Webhook,并且请求在定义为"responseProblem"的失败中完成。我不确定响应问题来自哪里。
Discord 在技术上应该能够接受 HTTP 请求,而对这个问题的大量研究让我一无所获。我以前使用过 Discord 网络钩子,但我以前从未玩过这种东西,所以我有点陷入我现在应该做的事情。
import Foundation
enum APIError:Error {
case responseProblem
case decodingProblem
case encodingProblem
}
struct APIRequest {
let resourceURL: URL
init(endpoint: String) {
let resourceString = "<discord-webhook-url-removed-for-privacy>"
guard let resourceURL = URL(string: resourceString) else {fatalError()}
self.resourceURL = resourceURL
}
func save (_ messageToSave:Message, completion: @escaping(Result<Message, APIError>) -> Void ) {
do {
var urlRequest = URLRequest(url: resourceURL)
urlRequest.httpMethod = "POST"
urlRequest.addValue("application/json", forHTTPHeaderField: "Content-Type")
urlRequest.httpBody = try JSONEncoder().encode(messageToSave)
let dataTask = URLSession.shared.dataTask(with: urlRequest) { data, response, _ in
guard let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200, let
jsonData = data else {
completion(.failure(.responseProblem)) // <<< 'responseProblem' is outputted in console as the error
return
}
do {
let messageData = try JSONDecoder().decode(Message.self, from: jsonData)
completion(.success(messageData))
} catch {
completion(.failure(.decodingProblem))
}
}
dataTask.resume()
} catch {
completion(.failure(.encodingProblem))
}
}
}
当我运行这个 Swift 程序时,我希望它向 Discord Webhook 发送请求,将消息发送到它的指定通道。但是,输出到控制台的唯一错误是responseProblem
。请让我知道我是否需要进一步添加任何内容才能找到问题的根本原因(我仍然对 Swift 半陌生,我通常使用 JavaScript,所以我不确定如何在 Swift 和 Xcode 中正确调试。
Swift 应用程序是在 iOS 12.2 中构建的,因为 Xcode 不喜欢 iOS 13 中的这些东西
。这是我如何使用 Swift 发布到 Discord webhook 的简化版本。从您的帖子中,我看不到您如何将自定义消息结构转换为 JSON 字典,但您至少需要"内容"的键/值对才能成功发布 Discord Webhook。当然,帖子可以通过许多其他方式进行自定义(使用自定义"用户名"等(。
var messageString: String = ""
guard let url = URL(string: "your-full-discord-webhook-url") else { return }
let messageJson: [String: Any] = ["content": messageString]
let jsonData = try? JSONSerialization.data(withJSONObject: messageJson)
var request = URLRequest(url: url)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "content-type")
request.httpBody = jsonData
let task = URLSession.shared.dataTask(with: request)
task.resume()