尝试在iOS上发送带有mailgun的电子邮件时出错400

时间:2017-03-21 06:53:44

标签: ios swift alamofire mailgun

我尝试使用Swift在iOS应用上使用mailgun发送电子邮件。除了安全性之外,我总是遇到400错误。如果我更改了一下密钥,我会得到一个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。我不知道我的参数有什么不对。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

  

除了在响应HEAD请求时,服务器应该发送一个   包含错误情况解释的表示,以及   无论是暂时的还是永久性的。

规则如下:

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

2-查看所选类别的可用响应代码。如果其中一个名称与您的情况匹配良好,则可以使用它。否则只需回退到x00代码(200,400,500)。如果您有疑问,请回退到x00代码。

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

4-如果客户需要区分不同的错误并根据它做出不同的反应,请定义机器可读和可扩展的错误格式,并在API中的任何位置使用它。从一开始就这样做是很好的做法。

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