ios - 尝试在 iOS 上使用 mailgun 发送电子邮件时出现错误 400

标签 ios swift alamofire mailgun

我正在尝试使用 Swift 在 iOS 应用程序上使用 mailgun 发送电子邮件。除了缺乏安全性,我总是会收到 400 错误。如果我稍微更改一下 key ,我会得到一个 401,这样身份验证就可以工作了。

我是否使用 Alamofire:

let parameters = ["Authorization" : "api:key-...",
                  "from": "from@email.com",
                  "to": "to@email.com",
                  "subject": "Test",
                  "text": "Testing email"]

alamofireManager.request("https://api.mailgun.net/v3/sandbox...mailgun.org/messages", method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: nil)
    .authenticate(user: "api", password: "key-...")
    .validate(statusCode: 200 ..< 300)
    .validate(contentType: ["application/json"])
    .responseJSON { response in
        print(response)
        print("Response : \(response.error)")
}

或者 NSMutableURLRequest:

let session = URLSession.shared
let request = NSMutableURLRequest(url: URL(string: "https://api.mailgun.net/v3/sandbox...mailgun.org/messages")!)

request.httpMethod = "POST"
let credentials = "api:key-..."
request.setValue("Basic \(Data(credentials.utf8).base64EncodedString())", forHTTPHeaderField: "Authorization")

let data = "from:Test<(test@test.com)>&to:[my_email_address@gmail.com,(my_email_address@gmail.com)]&subject:Hello&text:Testing_email"
request.httpBody = data.data(using: String.Encoding.ascii)

let task = session.dataTask(with: request as URLRequest, completionHandler: {(data, response, error) in
    if let error = error {
        print(error)
    }
    if let response = response {
        print("url = \(response.url!)")
        print("response = \(response)")
        let httpResponse = response as! HTTPURLResponse
        print("response code = \(httpResponse.statusCode)")
    }
})
task.resume()

我总是得到 400。我看不出我的参数有什么问题。有什么想法吗?

最佳答案

选择 HTTP 响应代码是一项非常简单的任务,可以用简单的规则来描述。唯一经常被遗忘的棘手部分是 RFC 7231 的第 6.5 段:

Except when responding to a HEAD request, the server SHOULD send a representation containing an explanation of the error situation, and whether it is a temporary or permanent condition.

规则如下:

1- 如果请求成功,则返回 2xx 代码(3xx 用于重定向)。如果服务器出现内部逻辑错误,则返回 5xx。如果客户端请求有错误,则返回4xx代码。

2- 查看所选类别中的可用响应代码。如果其中之一的名称与您的情况很相符,您可以使用它。否则就回退到 x00 代码(200、400、500)。如果您有疑问,请回退到 x00 代码。

5- 在响应正文中返回错误描述。对于 4xx 代码,它必须包含足够的信息,以便客户端开发人员了解原因并修复客户端。对于 5xx,出于安全原因,无需透露任何细节。

4- 如果客户端需要区分不同的错误并根据错误做出不同的 react ,请定义机器可读和可扩展的错误格式,并在您的 API 中随处使用。从一开始就做到这一点是很好的做法。

5- 请记住,客户端开发人员可能会做一些奇怪的事情并尝试解析您作为人类可读描述返回的字符串。通过更改字符串,您将破坏这些写得不好的客户。因此,始终提供机器可读的描述,并尽量避免以文本形式报告额外信息。

关于ios - 尝试在 iOS 上使用 mailgun 发送电子邮件时出现错误 400,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42920237/

相关文章:

swift - 类型 'OSType' 不符合 Swift 2.0 中的协议(protocol) 'AnyObject'

json - 选择器 View : I want data in picker view 2 change with picker view 1 when select data from picker view 1

ios - 向下滚动点击按钮继续下一个屏幕后如何验证 CustomCell 中的 UITextField - Swift 2.3

ios - 单元格中的图像不出现

ios - 具有 ObjectMapper 错误的模型类从初始化程序返回而不初始化所有存储的属性

swift - Alamofire:SessionManager 的超时不会根据配置而改变

ios - 如何为 iOS 视网膜显示器设置 Flot

ios - 将代码从 View Controller 中取出并将其移动到执行所有 Swift 功能的 "Brain"

ios - 如何删除 Firestore 路径上的观察者?

ios - 为了 "reload"应用程序,注销功能应该是什么样的?