IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants FMX Delphi Discussion :

Problème d'encodage UTF-8 avec TRESTRequest [Android]


Sujet :

Composants FMX Delphi

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut Problème d'encodage UTF-8 avec TRESTRequest
    Bonjour,

    Je développe une application pour smartphone Android via Rad Studio Tokyo 10.2.

    Quand l'utilisateur s'inscrit via l'application, j'envoie toutes ses données (nom, prénom, adresse, email, etc...) via une api à un prestataire qui stocke les infos dans sa base de données. J'utilise le composant TRESTRequest qui doit être mal paramétré, car le prestataire enregistre les données au format quoted printable au lieu de l'UTF-8. Si j'envoie les données via Postman, il n'y a aucun souci. Idem quand je récupère des infos avec accent : mes requêtes API en méthode GET gère parfaitement les accents.

    exemple : Hélène devient H=E9l=E8ne

    cahier des charges pour l'api du prestataire :
    - call POST
    - format application/json ou form-data
    - paramètres Header (token)
    - paramètres body (nom, prenom, adresse, etc...)


    le paramétrage des propriétés TRESTRequest par défaut :
    - accept : application/json, text/plain; q=0.9, text/html;q=0.8,
    - acceptcharset : UTF-8, *;q=0.8
    - acceptEncoding :
    - Params : chaque champ (nom prenom adresse etc) sont paramétrés ainsi :
    - contentType : ctNone
    - kind : pkREQUESTBODY
    - options : podonotencode = false; potransient = false; poautocreated = false
    - value : affectation dans le code (ex : user_restreq.Params.Items[1].Value := nom_ed.Text

    j'ai tenté de paramétrer le kind des paramètres en pkGETorPOST ou le contentType en ctAPPLICATION_JSON mais le retour de l'api m'envoie une erreur (une erreur s'est produite, ou le nombre de paramètres n'est pas correct...).

    Je vois bien que je n'ai pas paramétré mon composant correctement, mais j'ai beau cherché, je ne trouve aucune info pour forcer l'encodage en UTF-8.

    quelqu'un à une idée ?

    merci.

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    bonjour à tous,

    pas de réponse, pas de suggestions ?

    je ne suis peut être pas sur le bon forum ? API, COM et SDKs serait il plus approprié ?

    je suppose que je ne suis pas la seule personne à faire appel à une api en méthode POST : utilisez vous d'autres composants que TRESTRequest pour cela ?

    merci...

  3. #3
    Membre expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 661
    Points : 3 630
    Points
    3 630
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Il est normal qu'en "quoted printable" les caractères accentués soient traduits avec le signe = suivi du code hexa du caractère. Seuls les 128 caractères imprimables de la table ASCII sont présents en quoted printable.
    Si via Postman, l'enregistrement en base se fait bien avec les accents, c'est que le jeu de caractères utilisé par la base accepte les accents... donc pas en quoted printable. Par contre, vous passez peut être en quoted printable lors de la communication.
    Avec vous utilisé Fiddler pour voir les requêtes/réponses passées ? (et tenter de voir comment Postman envoie les données)
    Mon site - Mes tutoriels - GitHub - N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    bonsoir gbegreg,

    merci d'avoir pris le temps de répondre à mes questions...

    Citation Envoyé par gbegreg Voir le message
    vous passez peut être en quoted printable lors de la communication.
    J'en ai bien conscience : c'est justement la raison de mon appel à l'aide...

    Citation Envoyé par gbegreg Voir le message
    Avez vous utilisé Fiddler pour voir les requêtes/réponses passées ? (et tenter de voir comment Postman envoie les données)
    Oui et voici le résultat via postman, on voit bien que le format json est correctement affecté :

    Nom : 2018-02-03_21h39_33.png
Affichages : 1706
Taille : 20,2 Ko

    ma requête via restrequest, elle, confirme l'encodage en quoted-printable avec un format form-data :

    Nom : 2018-02-03_20h32_09.png
Affichages : 1720
Taille : 39,4 Ko

    le prestataire accepte les deux formats : json ou form-data. Moi, je veux juste encoder les données en UTF-8 ! mais comment ?

    j'ai tenté sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          user_restreq.Params.AddHeader('Content-Transfer-Encoding', 'UTF-8');
    j'ai également essayé de passer au format application json en paramétrant tous les contenttype des trestrequestparameter à ctAPPLICATION_JSON mais c'est un vrai cafouillage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
          user_restreq.Params.Items[0].Value := tokengroupe_co;
          user_restreq.Params.Items[1].Value := nom_ed.Text;
          user_restreq.Params.Items[2].Value := prenom_ed.Text;
          user_restreq.Params.Items[3].Value := IntToStr(genre_cb.ItemIndex + 1);
          user_restreq.Params.Items[4].Value := IntToStr(type_cb.ItemIndex + 1);
          user_restreq.Params.Items[5].Value := codepostal_ed.Text;
          user_restreq.Params.Items[6].Value := ville_ed.Text;
          user_restreq.Params.Items[7].Value := email_ed.Text;
          user_restreq.Params.Items[8].Value := telephone_ed.Text;
          user_restreq.Params.Items[9].Value := nvmotpasse_ed.Text;
         ...
    voici le retour de fiddler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test_àâäéèêë-16test-ôö ûü'ù_161116testdevtestdev1616testdev1601233
    on est très loin du paramétrage json...

    personne n'utilise ces compos ? j'ai vraiment l'impression d'avoir juste zappé de paramétrer une propriété...

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Le problème du JSON c'est qu'il n'est pas Unicode mais seulement ASCII
    Et donc la solution évidente (peut-être qu'il en a d'autres) c'est à l'envoi d'échapper les caractères Unicode (avec les \x, \u et \U) et à la réception de reformer les caractères. Parce que, apparemment, cette moulinette n'est pas faite automatiquement

    Édit : Regarde ici pour plus de précisions Escape sequences in C, Table of escape sequences (<- lien Wiki)


    test_àâäéèêë-16test-ôö ûü'ù_161116testdevtestdev1616testdev1601233
    Ceci ressemble à de l'UTF-8/ UTF-16 lu soit en ASCII soit en ANSI (mbcs)

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    bonjour,

    Citation Envoyé par foetus Voir le message
    la solution évidente (peut-être qu'il en a d'autres) c'est à l'envoi d'échapper les caractères Unicode (avec les \x, \u et \U) et à la réception de reformer les caractères. Parce que, apparemment, cette moulinette n'est pas faite automatiquement
    Si. cette moulinette est faite automatiquement par les compos REST quand je récupère des données en methode GET (comme précisé dans mon premier message ) : je reçois bien les accents sans faire de transtypage manuel.

    et j'ai tout de même essayé de remplacer les accents avec les \u mais ça n'a rien changé : le prestataire enregistre dans sa base de données les \u et me les renvoie tel quel

    où est ce que je peux trouver des docs complètes sur les compos REST ? les seules infos que j'ai trouvé sont basiques... et il faut vraiment que je trouve une solution à mon problème de paramétrage :
    - soit je configure correctement le compo pour un envoi en JSON (je suppose qu'il doit être capable de faire de belles accolades...)
    - soit je configure correctement le compo pour un envoi en form data avec un encodage en UTF-8 (il doit bien y avoir une propriété qui permet de passer le content-transfer-encoding en UTF-8)

    bouh...

  7. #7
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonjour,

    Comment crées-tu tes paramètres ? c'est peut-être là le problème : les propriétés de chacun (en particulier name,contenttype) sont-elles bien indiquées ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      RESTRequest.Method := TRESTRequestMethod.rmPOST;
      RESTRequest.Params.Clear;
      RESTRequest.Params.AddItem('Nom','tesdév 14', TRESTRequestParameterKind.pkGETorPOST);
      RESTRequest.Params.AddItem('Prénom','déaccentués', TRESTRequestParameterKind.pkGETorPOST);
      RESTRequest.Execute;
    ou alors par JSON

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    var
      jsResponse: TJSONValue;
      jsRequest: TJSONObject;
     
    begin
      jsRequest := TJSONObject.Create();
      jsRequest.AddPair('nom','Testdèv 14');
      jsRequest.AddPair('prénom', 'test dév');
      RESTRequest.AddBody(jsRequest);
      jsRequest.Free();
      RESTRequest.Execute();
      jsResponse := RESTRequest.JSONValue;
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    Bonjour Sergio,

    Un grand merci pour ton aide. La première solution était déjà celle que je paramétrais pour chaque propriété dans l'inspecteur d'objets... échec : en pkGETorPOST, ça ne passe pas.

    par contre, ton code en JSON m'a permis de résoudre le problème !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    var
      jsResponse: TJSONValue;
      jsRequest: TJSONObject;
    begin
          user_restreq.Method := TRESTRequestMethod.rmPOST;
          user_restreq.Params.Clear;
          user_restreq.Params.AddItem('token', token_st, TRESTRequestParameterKind.pkHTTPHEADER);
          jsRequest := TJSONObject.Create();
          jsRequest.AddPair('nom','tesdév ');
          jsRequest.AddPair('prenom','testdéèv');
          jsRequest.AddPair('genre','1');
          jsRequest.AddPair('type','1');
          jsRequest.AddPair('cp', cp_st);
          jsRequest.AddPair('ville','testdev');
          jsRequest.AddPair('email','testdev');
          jsRequest.AddPair('mobile', mobile_st);
          jsRequest.AddPair('mdp','testdev');
          jsRequest.AddPair('login_type','0');
          jsRequest.AddPair('salon','1234');
          user_restreq.AddBody(jsRequest);
          jsRequest.Free();
          user_restreq.Execute();
          jsResponse := user_restreq.Response.JSONValue;
    juste une question qui me titille suite à ce problème d'encodage : des adresses mails ainsi que des noms prénoms finissaient par =E20. Dans une table de correspondance (http://www.ic.unicamp.br/~stolfi/EXP...-Encoding.html), ce codage semble correspondre à un espace. Pourtant, je vois mal l'utilisateur saisir systématiquement un espace à la fin de son texte dans le TEdit ; d'autant que les espaces que j'ai volontairement ajoutés n'étaient jamais codés

    en faisant des recherches sur ce caractère parasite, j'ai trouvé par hasard des pages où il se situe systématiquement en fin de ligne : http://giannico.free.fr/Honoraires.mht

    j'ai fait un Trim des Tedits pour chaque affectation afin, je l'espère, de résoudre ce problème. L'un de vous a une idée de ce dont il peut s'agir ? un "pseudo" retour chariot quand l'utilisateur bascule d'un Edit à l'autre via son clavier ? Perso, je n'ai pas réussi à reproduire ce cas de figure

  9. #9
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonsoir,
    Citation Envoyé par delaio Voir le message
    Un grand merci pour ton aide. La première solution était déjà celle que je paramétrais pour chaque propriété dans l'inspecteur d'objets... échec : en pkGETorPOST, ça ne passe pas.
    qu'est-ce qui ne passait pas , la compilation ?

    par contre, ton code en JSON m'a permis de résoudre le problème !
    tant mieux !
    juste une question qui me titille suite à ce problème d'encodage : des adresses mails ainsi que des noms prénoms finissaient par =E20. Dans une table de correspondance (http://www.ic.unicamp.br/~stolfi/EXP...-Encoding.html), ce codage semble correspondre à un espace. Pourtant, je vois mal l'utilisateur saisir systématiquement un espace à la fin de son texte dans le TEdit ; d'autant que les espaces que j'ai volontairement ajoutés n'étaient jamais codés ...
    j'ai fait un Trim des Tedits pour chaque affectation afin, je l'espère, de résoudre ce problème. L'un de vous a une idée de ce dont il peut s'agir ? un "pseudo" retour chariot quand l'utilisateur bascule d'un Edit à l'autre via son clavier ? Perso, je n'ai pas réussi à reproduire ce cas de figure
    Ce que fait l'utilisateur, j'en ai souvent eu confirmation, est souvent étonnant, le trim devrait logiquement régler le problème
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    qu'est-ce qui ne passait pas , la compilation ?
    si si... ça compile et ça s'envoie. c'est le prestataire qui ne validait pas la requête en me retournant un message d'erreur : "le nombre de paramètres reçus n'est pas correct".

    Etant donné que dans le cahier des charges il est spécifié que les paramètres sont BODY avec un CALL API en POST, j'ai supposé que le paramétrage GetorPost ne leur convenait pas à la lecture...

    Ce que fait l'utilisateur, j'en ai souvent eu confirmation, est souvent étonnant, le trim devrait logiquement régler le problème
    oui, mais ce caractère parasite est trop fréquent et récurrent sur plusieurs champs pour que ce soit une "mauvaise manip" de l'utilisateur... et puis surtout, j'ai eu beau mettre des espaces, ça ne générait aucun =20 !!!

    du coup, je suis septique sur l'efficacité d'un trim sur les edits. Je me demande plutôt si ce caractère ne serait pas généré par le restrequest à l'envoi de la requête... !?!!

  11. #11
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 042
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 042
    Points : 40 952
    Points
    40 952
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    Citation Envoyé par delaio Voir le message
    oui, mais ce caractère parasite est trop fréquent et récurrent sur plusieurs champs pour que ce soit une "mauvaise manip" de l'utilisateur... et puis surtout, j'ai eu beau mettre des espaces, ça ne générait aucun =20
    Dire que cela vient du RestRequest peut-être ou pas
    tu as vérifié le JSONObject ?
    cogitations fumeuses :il y a peut être une histoire de longueur de valeur qui traine par exemple : 'testdéèv' = 8 + le null de terminaison du coup le Post envoi 9 car (d'où le =20)

    as-tu essayé de "forcer" le type de valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       jsRequest.AddPair('nom',TJSonString.Create('tesdév '));
       jsRequest.AddPair('prenom',TJSONString.Create('testdéèv'));
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 98
    Points
    98
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    cogitations fumeuses :il y a peut être une histoire de longueur de valeur qui traine par exemple : 'testdéèv' = 8 + le null de terminaison du coup le Post envoi 9 car (d'où le =20)
    oui, un truc dans le genre probablement... le tout est de trouver LE cas de figure qui déclenche ce =20...

    Citation Envoyé par SergioMaster Voir le message
    as-tu essayé de "forcer" le type de valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       jsRequest.AddPair('nom',TJSonString.Create('tesdév '));
       jsRequest.AddPair('prenom',TJSONString.Create('testdéèv'));
    oui mais ça n'a rien donné de probant et impossible de reproduire l'erreur. tant pis. je déploie en espérant que ce problème est lié à l'encodage avec le format form-data et que la bascule en json était la solution.

    en attendant, merci encore pour le coup de main !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FPDF] Encodage UTF-8
    Par navis84 dans le forum Bibliothèques et frameworks
    Réponses: 17
    Dernier message: 08/09/2018, 12h43
  2. [ZF 1.10] Problème d'encodage UTF-8 avec Zend_Db Mysqli
    Par arnolem dans le forum Zend_Db
    Réponses: 1
    Dernier message: 21/04/2010, 00h12
  3. Problème d'encodage UTF-8
    Par Shugo78 dans le forum Ubuntu
    Réponses: 0
    Dernier message: 23/11/2007, 19h40
  4. [MySQL] Problème d'encodage UTF-8
    Par cloridriks dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 30/10/2007, 11h19
  5. PB encodage UTF-8 avec Japonais, Chinois
    Par ch33k0n dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 18/06/2007, 12h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo