2017-03-21 163 views
1

我正嘗試使用Swift在iOS應用上使用mailgun發送電子郵件。拋開安全性不足,我總是得到一個400錯誤。如果我更改了一下密鑰,我會得到一個401,所以驗證工作。嘗試在iOS上使用mailgun發送電子郵件時出現錯誤400

無論我用Alamofire:

let parameters = ["Authorization" : "api:key-...", 
        "from": "[email protected]", 
        "to": "[email protected]", 
        "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<([email protected])>&to:[[email protected],([email protected])]&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。我沒有看到我的參數有什麼問題。任何想法?

+0

由於格式錯誤,服務器無法理解請求。客戶端不應該在沒有修改的情況下重複請求。 –

+0

檢查你的網址和請求正文 –

+0

URL好像我改變了一些東西,我得到了一個'404'。是的,我猜這個問題可能來自請求主體,但我看不到任何錯誤,提示我的帖子在這裏。 – Nico

回答

0

選擇一個HTTP響應代碼是相當容易的任務,可以用簡單的規則來描述。這常常被遺忘唯一棘手的部分是第6.5段從RFC 7231:

除了當響應HEAD請求,服務器應該發送包含有關錯誤情況的解釋一個 表示,並且 它是否是一個暫時或永久的狀況。

規則如下:

1-如果請求成功,則返回2XX代碼(3XX用於重定向)。如果服務器上存在內部邏輯錯誤,則返回5xx。如果客戶端請求中有任何錯誤,則返回4xx代碼。

2-查看所選類別的可用響應代碼。如果其中一個名稱與您的情況匹配得很好,您可以使用它。否則只需回退到x00代碼(200,400,500)。如果您懷疑,則回退到x00代碼。

5-在響應主體中返回錯誤描述。對於4xx代碼,它必須包含足夠的信息,以便客戶開發人員瞭解原因並修復客戶端。對於5xx,由於安全原因,不得透露任何細節。如果客戶端需要區分不同的錯誤並根據它們有不同的反應,請定義一個機器可讀和可擴展的錯誤格式,並在您的API中的任何地方使用它。從一開始就做好這個做法是很好的做法。請記住,客戶端開發人員可能會做一些奇怪的事情,並嘗試解析您返回的字符串作爲人類可讀的描述。而通過改變字符串,你將打破這種寫得不好的客戶端。因此,請始終提供機器可讀的說明,並儘量避免報告文本中的其他信息。

相關問題