2017-03-21 1 views
1

J'essaie d'envoyer un e-mail en utilisant mailgun sur une application iOS avec Swift. Manque de sécurité de côté, je reçois toujours une erreur 400. Si je change un peu la clé, j'obtiens un 401 pour que l'authentification fonctionne.Erreur 400 en essayant d'envoyer un e-mail avec mailgun sur iOS

Que j'utilise 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)") 
} 

Ou 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() 

je reçois un 400 toujours. Je ne vois pas ce qui ne va pas dans mes paramètres. Une idée?

+0

La requête n'a pas pu être comprise par le serveur en raison d'une syntaxe mal formée. Le client NE DEVRAIT PAS répéter la demande sans modifications. –

+0

vérifiez votre URL et demandez le corps –

+0

L'URL est bien comme si je change quelque chose, je reçois un '404'. Et oui, je suppose que le problème pourrait provenir du corps de la requête, mais je ne vois pas d'erreur, insinuez mon message ici. – Nico

Répondre

0

La sélection d'un code de réponse HTTP est une tâche assez facile et peut être décrite par des règles simples. La seule partie délicate qui est souvent oublié est le paragraphe 6.5 de la RFC 7231:

Sauf lors de la réponse à une requête HEAD, le serveur DEVRAIT envoyer une représentation contenant une explication de la situation d'erreur et si elle est condition temporaire ou permanente.

règles sont les suivantes:

1- Si la demande a réussi, alors le code de retour 2xx (3xx pour redirect). S'il y avait une erreur de logique interne sur un serveur, renvoyez 5xx. Si quelque chose ne va pas dans la requête du client, alors renvoyez le code 4xx.

2- Regardez à travers le code de réponse disponible de la catégorie sélectionnée. Si l'un d'entre eux a un nom qui correspond bien à votre situation, vous pouvez l'utiliser. Sinon, il suffit de se replier sur le code x00 (200, 400, 500). Si vous doutez, retournez au code x00.

5- Description de l'erreur de retour dans le corps de la réponse. Pour les codes 4xx, il doit contenir suffisamment d'informations pour que le développeur du client comprenne la raison et corrige le client. Pour 5xx pour des raisons de sécurité, aucun détail ne doit être révélé. 4- Si le client doit distinguer différentes erreurs et avoir des réactions différentes en fonction de cela, définissez un format d'erreur lisible par machine et extensible et utilisez-le partout dans votre API. C'est une bonne pratique de faire cela dès le début.

5- Gardez à l'esprit que le développeur client peut faire des choses étranges et essayer d'analyser des chaînes que vous renvoyez comme une description lisible par un humain. Et en changeant les chaînes, vous casserez ces clients mal écrits. Donc, fournissez toujours une description lisible par une machine et essayez d'éviter de signaler des informations supplémentaires dans le texte.