2017-10-16 5 views
1

Je crée un appel de connexion à une API à l'aide de données x-www-form-endoded. J'ai créé un POST dans Postman et a reçu une réponse 200. J'ai utilisé la fonction d'exportation de Postman pour générer le code OKHTTP pour Android et le code NSURL pour iOS. Le code Android fonctionne bien, mais le code iOS reçoit une réponse 401. J'ai utilisé le proxy de débogage de Charles pour voir ce qui était réellement envoyé pour la charge utile. Pour Android le nom d'utilisateur est correctement représenté comme "[email protected]" mais dans iOS, il apparaît comme "username = james [email protected]". Mon code iOS est ci-dessous:iOS UrlSession.shared.dataTask supprime le caractère "+" utf-8 et le remplace par ""

let headers = [ 
    "accept": "application/json", 
    "cache-control": "no-cache", 
    "content-type": "application/x-www-form-urlencoded" 
] 

let postData = NSMutableData(data: "[email protected]".data(using: .utf8)!) 
postData.append("&password=redacted".data(using: .utf8)!) 
postData.append("&grant_type=password".data(using: .utf8)!) 
postData.append("&client_id=redacted".data(using: .utf8)!) 
postData.append("&client_secret=redacted".data(using: .utf8)!) 

    let request = NSMutableURLRequest(url: NSURL(string: "https://redacted.com/api/oauth2/token/")! as URL, 
             cachePolicy: .useProtocolCachePolicy, 
             timeoutInterval: 10.0) 
    request.httpMethod = "POST" 
    request.allHTTPHeaderFields = headers 
    request.httpBody = postData as Data 
    let session = URLSession.shared 
    let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in 
     if (error != nil) { 
      print(error) 
     } else { 
      let httpResponse = response as? HTTPURLResponse 
      print(httpResponse) 
     } 
    }) 

Quand je suis dans le code iOS à la fois les objets et données NSMutableData afficher correctement le nom d'utilisateur « [email protected] », tout en laissant le URLSession.shared comme la cause potentielle de l'erreur. Mais je ne peux pas entrer dans URLSession.shared.dataTask() car c'est une méthode privée. Toute aide est appréciée.

Répondre

1

L'encodage des caractères "+" pose problème. Vous pouvez essayer ceci:

let postData = NSMutableData(data: "username=james%[email protected]".data(using: .utf8)!) 
+1

@JamesJordanTaylor: Je suppose que l'espace a aussi des problèmes. En fait, si votre serveur accepte le type JSON, il vaut mieux utiliser NSJSONSerialization pour créer un objet de données à partir d'un fichier json et le transmettre au serveur au lieu d'utiliser utf8 on strings. –

+0

Le vrai problème est que vous avez oublié de définir l'en-tête Content-Type. La gestion des données de corps est indéfinie sans cela. Votre serveur effectue probablement le décodage pour vous lorsqu'il est fourni avec le type de contenu par défaut d'iOS. – dgatwood