[SWIFT] Alamofire et Headers ?

Hola ^^

Je suis sur un projet qui me donne du fil à retordre et je galère un peu avec Alamofire..

En gros, j'essaie d'interroger une API avec Alamofire mais pour ça, je dois lui passer mon token en Headers et je tourne en rond..

Ca fonctionne très bien lors des tests avec Postman.
Voici la capture d'écran.. je passe bien mon token dans le header..

Je reçois bien la réponse en JSON de mon API.

Comment faire pour reproduire cette manipulation via Alamofire ?
Comment lui passer un token en header ?

Une idée ? Une piste ?

Merci de votre aide :)

Mots clés:

Réponses

  • Déjà, est ce qu'on est d'accord que pour envoyer des paramètres (en post) ainsi que des headers, le code suivant est bon :

    let Paramètres = [
        "IdSociete": "1000"
     ]
    
    let urlString = monUrl+"/myAccount"
    let headers: [String : String] = ["X-AUTH-TOKEN": "BlablablaMonToken"]
    
    Alamofire.request(urlString, method: .post, parameters : Paramètres as Parameters, headers: headers).responseJSON { response in
         print("--- ICI ----")
         print(response)
     }
    

    ça m'aidera déjà à voir si je pars d'une bonne base et que peut-être, le soucis est ailleurs :/

  • Astuce:

    Plutôt que faire :
    Alamofire.request(...).responseJSON{...}

    Fait:

    let request = Alamofire.request()
    print("request: \(request)")
    request.responseJSON{...}
    

    Cela devrait te mettre dans la console un code "bash" avec un curl.

    Dans POSTMAN, demande-lui de générer l'équivalent de la requête en Bash/cURL.

    Tu devrais trouver la différence, et tester différents paramétrages de ton côté jusqu'à tomber sur le bon.

  • Merci de l'astuce ^^

    Du coup en testant, j'obtiens juste l'url dans la console..

    POST : http://monurl/blablabla/myAccount
    

    Aucun paramètres, aucun headers.. pourtant ils sont bien passés dans mon code :/

  • LarmeLarme Membre
    janvier 2019 modifié #5

    Pardon, appelles plutôt :
    print("request: \(request.debugDescription)") ou print("request: \(request.curlRepresentation)").
    C'est tiré d'une de mes réponses sur SO.

  • InsouInsou Membre
    janvier 2019 modifié #6

    C'était en effet :

    print(request.debugDescription)
    

    Du coup, j'ai bien mes 2 comparaisons et pour moi, c'est bon, j'ai bien tout mes parametres et headers dans la requete Alamofire :/

    Requête Postman :

    curl -X POST \
    http://monUrl/myAccount \
    -H 'Postman-Token: 9082ed01-7029-43cf-a5b3-c05df6b793d7' \
    -H 'X-AUTH-TOKEN: MonToken' \
    -H 'cache-control: no-cache' \
    -d '{
     "IdSociete":"1"
     }'
    

    Requête Alamofire :

    $ curl -v \
    -X POST \
    -H "User-Agent: MonAppli/1.0 (MonAppli.BlaBlaBla-v2; build:1; iOS 12.1.0) Alamofire/4.7.3" \
    -H "Content-Type: application/x-www-form-urlencoded; charset=utf-8" \
    -H "Accept-Encoding: gzip;q=1.0, compress;q=0.5" \
    -H "X-AUTH-TOKEN: MonToken" \
    -H "Accept-Language: fr-US;q=1.0, en;q=0.9, fr-FR;q=0.8" \
    -d "IdSociete=1" \
    "http://monUrl/myAccount"
    

    J'ai bien mon token, j'ai bien mon parametres (IdSociete) .. pourtant je me retrouve avec une erreur 500..

    Voici ce que me dit la console :

    CredStore - performQuery - Error copying matching creds.  Error=-25300, query={
        atyp = http;
        class = inet;
        "m_Limit" = "m_LimitAll";
        ptcl = http;
        "r_Attributes" = 1;
        sdmn = "monurl.locale";
        srvr = "monurl.locale";
        sync = syna;
    }
    
  • Dans l'doute, tu n'envoies pas du JSON dans le cas d'Alamofire, mais du form url encoded.

  • @Larme a dit :
    Dans l'doute, tu n'envoies pas du JSON dans le cas d'Alamofire, mais du form url encoded.

    Ah oui merde, je suis complètement passé à côté..

    Du coup, voici mon nouveau code et maintenant ça fonctionne ^^
    J'ai juste rajouter l'encodage (encoding : JSONEncoding.default) dans ma requête et c'est good, j'ai bien une réponse de mon serveur.. pfiouf ^^

    let request = Alamofire.request(urlString, method: .post, parameters : Paramètres as Parameters, encoding : JSONEncoding.default, headers: headers)
    

    Merci Larme :smiley:

  • Maintenant que c'est résolu on peut parler de ta manière déplorable de nommer tes variables ?

    let Paramètres = [
        "IdSociete": "1000"
     ]
    

    Déjà une majuscule pour un nom de variable c'est proscrit dans la majorité des langages.
    D'autre part ce n'est pas parce que Swift autorise l'unicode dans les noms de composants qu'il faut l'utiliser. Ce qui fait que les caractères accentués sont à proscrire également.

    Après c'est ton code, tu fais comme tu veux mais ça pique les yeux.

  • Un jour j'ai écrit un petit programme avec uniquement des emojis comme noms de variables, juste pour rigoler. Amusant 30 secondes, mais horrible sur le long terme. Je n'ai jamais recommencé, restant fidèle à la notation chameau, sans minuscules accentuées.

    let ceciEstUneVariableChameau = true

    Insou, les identifiants avec une majuscule, c'est pour le nom des classes et les types de variables !

    let maMaison = UneMaison()

Connectez-vous ou Inscrivez-vous pour répondre.