【问题标题】:Sending HTTP POST request with Swift to Discord Webhook results in Response Error使用 Swift 向 Discord Webhook 发送 HTTP POST 请求会导致响应错误
【发布时间】: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 编码形式等?

标签: ios discord xcode11 swift5


【解决方案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()

【讨论】:

    猜你喜欢
    • 2018-01-02
    • 2021-06-04
    • 1970-01-01
    • 2020-04-22
    • 2017-03-01
    • 2017-12-08
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    相关资源
    最近更新 更多