使用 Swift 向 Discord Webhook 发送 HTTP POST 请求会导致响应错误
Posted
技术标签:
【中文标题】使用 Swift 向 Discord Webhook 发送 HTTP POST 请求会导致响应错误【英文标题】:Sending HTTP POST request with Swift to Discord Webhook results in Response Error 【发布时间】:2020-02-04 14:29:32 【问题描述】:我正在尝试在 Swift 中创建一个 URL 请求,以将 HTTP POST 请求发送到 Discord Webhook,并且请求在定义为“responseProblem”的失败中完成。我不确定响应问题的根源。
Discord 在技术上应该能够接受 HTTP 请求,但对这个问题的大量研究让我无处可去。我以前使用过 Discord webhook,但我以前从未玩过这种东西,所以我有点坚持我现在应该做什么。
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 中的这些东西
【问题讨论】:
哪一个守卫失败了?httpResponse
? httpResponse.statusCode
? jsonData
?进入失败案例的原因有3个,至少告诉我们哪一个失败了。打印每个:response
和 data
(或 String(data: data, encoding: .utf8)
)
@Larme 我打印了响应和数据,响应中嵌套了状态代码 400。这是输出: Optional(URLRequest
中丢失或错误的任何内容。检查文档? httpBody 中的参数是否为 JSON?不是 URL 编码形式等?
【参考方案1】:
这是我如何使用 Swift 发布到 Discord webhook 的简化版本。从您的帖子中,我看不到您如何将自定义 Message 结构转换为 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()
【讨论】:
以上是关于使用 Swift 向 Discord Webhook 发送 HTTP POST 请求会导致响应错误的主要内容,如果未能解决你的问题,请参考以下文章
在 Discord 中使用 cron 在特定时间向特定频道发送消息
您能否确定是不是可以使用 discord.py 直接向用户发送消息?
如何使用JS和Chrome控制台向频道发送Discord消息?