使用 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个,至少告诉我们哪一个失败了。打印每个:responsedata(或 String(data: data, encoding: .utf8) @Larme 我打印了响应和数据,响应中嵌套了状态代码 400。这是输出: Optional( URL: discordapp.com/api/webhooks/<removed-for-privacy> Status Code: 400, Headers (我删除了标题,因为它们无法放入此评论框中) HTTP 错误 400 是错误请求。 “我以前使用过 Discord webhook”:也许您的参数、标题等在您的 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消息?

尝试向多个 Discord 频道发送消息

Discord Py - 如何使用文本命令向公会的所有成员添加多个角色

Discord.js 机器人无法向特定频道发送消息