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

Delphi Discussion :

Delphi appel API ne fonctionne pas


Sujet :

Delphi

  1. #1
    Membre du Club
    Homme Profil pro
    Responsable d'un système d'information métier
    Inscrit en
    Novembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Responsable d'un système d'information métier
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2014
    Messages : 9
    Par défaut Delphi appel API ne fonctionne pas
    Bonjour j'essaie d'appeler un service pour récupérer un Bearer
    L'appel dans Postman et dans Powershell fonctionne très bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $headers.Add("Content-Type", "application/json")
     
    $body = @"
    {
        `"username`" : `"13`",
        `"password`" : `"*******`"
    }
    "@
     
    $response = Invoke-RestMethod 'https://api.ptsrc.adeiz.com/api/authenticate' -Method 'POST' -Headers $headers -Body $body
    $response | ConvertTo-Json

    Quand j'essaie de faire ça dans Delphi j'ai toujours la réponse erreur 415 type de média non pris en charge

    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
    procedure TForm5.Button1Click(Sender: TObject);
     
    var Ljsonobject:tJsonObject;
    ltoken:string;
    Litem:tjsonvalue;
    begin
     
      Ljsonobject:=TJSONObject.Create;
      Ljsonobject.AddPair('username','13');
      Ljsonobject.AddPair('password','******');
    //
      Memo1.lines.add(Ljsonobject.ToJSON);
    //
      RESTClient1.BaseURL:='https://api.ptsrc.adeiz.com/api/authenticate';
      restclient1.po
      RESTRequest1.AddBody(Ljsonobject.tojson);
     
      RESTRequest1.execute;
      memo1.lines.add(RESTResponse1.Content);
    end;
    RESTDEBUGUEUR me donne ça qui fonctionne
    object RESTClient1: TRESTClient
    Authenticator = SimpleAuthenticator1
    BaseURL = 'https://api.ptsrc.adeiz.com/api/authenticate'
    Params = <>
    SynchronizedEvents = False
    end
    object RESTRequest1: TRESTRequest
    AssignedValues = [rvConnectTimeout, rvReadTimeout]
    Client = RESTClient1
    Method = rmPOST
    Params = <
    item
    Kind = pkREQUESTBODY
    Name = 'body5E80281D4D8B40AFB2A68221EAB654D9'
    Value = '{'#13#10' "username" : "13",'#13#10' "password" : "******"'#13#10'}'
    ContentTypeStr = 'application/json'
    end>
    Response = RESTResponse1
    SynchronizedEvents = False
    end
    object RESTResponse1: TRESTResponse
    end
    object SimpleAuthenticator1: TSimpleAuthenticator
    end
    mais je ne comprends pas comment remplir simplement la partie params surtout d'ou sort 'body5E80281D4D8B40AFB2A68221EAB654D9' ??

    quelqu'un peut il m'aider

  2. #2
    Membre expérimenté
    Avatar de XeGregory
    Homme Profil pro
    Passionné par la programmation
    Inscrit en
    Janvier 2017
    Messages
    727
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Passionné par la programmation
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2017
    Messages : 727
    Billets dans le blog
    1
    Par défaut
    Ton problème vient certainement du Content-Type que Delphi n’envoie pas correctement.
    L’erreur 415 Unsupported Media Type signifie que le serveur n’a pas reçu application/json comme Content-Type, ou que le body n’est pas encodé comme il l’attend.
    On ne peut pas faire confiance à un code qu'on n'a pas entièrement écrit soi‑même, et encore moins à celui qu'on a écrit entièrement. :aie:

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 149
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 149
    Par défaut
    Tu n'a pas transmis de Header dans le code Delphi

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 231
    Par défaut
    Je modifierais le AddBody comme ceci, c'est en tout cas ce que je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        VRequest.AddBody(AJSONText, ctAPPLICATION_JSON);
    donc pour toi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    RESTRequest1.AddBody(Ljsonobject.ToJson(), ctAPPLICATION_JSON);


    Je n'utilise que des objets crées à la volée, je te recommande cela aussi, exemple d'inspiration, j'utilise la même fonction Post pour obtenir un Token puis une fois obtenu pour l'invocation de l'API cible.

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    //------------------------------------------------------------------------------
    class function TxxxServiceClientHTTPByRESTClientIPPeer.Post(const AURL, AResource: string; const AJSONText: string; const AResponseCodes: TArray<Integer>; const AToken: string = ''; ATimeOut: Integer = -1): TxxxServiceClientResponse;
     
      function AuthenticatorFactory(): TCustomAuthenticator;
      begin
        if AToken <> '' then
        begin
          Result := TOAuth2Authenticator.Create(nil);
          try
            TOAuth2Authenticator(Result).AccessToken := AToken;
            TOAuth2Authenticator(Result).TokenType := TOAuth2TokenType.ttBEARER;
          except
            FreeAndNil(Result);
            raise;
          end;
        end
        else
          Result := nil;
      end;
     
    var
      VClient: TRESTClient;
      VRequest: TRESTRequest;
    begin
      VClient := TRESTClient.Create(AURL);
      try
        VRequest := TRESTRequest.Create(VClient); // The Client owns the Request (will free it) and it will assign as Client property
        VRequest.Resource := AResource;
        VRequest.Method := TRESTRequestMethod.rmPOST;
     
        VRequest.AddBody(AJSONText, ctAPPLICATION_JSON);
     
        VClient.Authenticator := AuthenticatorFactory();
        try
          Execute(VRequest, ATimeOut, AResponseCodes);
        finally
          VClient.Authenticator.Free();
          VClient.Authenticator := nil;
        end;
     
        if VRequest.Response.ContentType = TxxxServiceClient.CONTENT_TYPE_JSON then
          Result := TxxxServiceClientResponse.CreateFromJSON(VRequest.Response.JSONValue, VRequest.Response.StatusCode)
        else
          Result := TxxxServiceClientResponse.Create(VRequest.Response.StatusCode, VRequest.Response.Content, VRequest.Response.ContentType);
      finally
        VClient.Free();
      end;
    end;
    Ensuite chaque API/Service à son wrapper

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    //------------------------------------------------------------------------------
    function TxxxServicexxxBidule.BidulePost(ABiduleRequest: TBiduleRequest): TBiduleResponse;
    var
      VResource: string;
      VResponse: TxxxServiceClientResponse;
      VResponseJSON: TJSONObject;
      VExpectedCode: Integer;
    begin
      Result := TBiduleResponse.Create(ABiduleRequest.IDPTenantID);
      try
        try
          VResource := REQUEST_Bidule;
          VExpectedCode := Result.SUCCESS_OF_PHASE[ipAcceptation];
     
          VResponse := TxxxServiceClient.Post(FURLWithPort, VResource, ABiduleRequest.JSONText, [VExpectedCode], ABiduleRequest.xxxToken, FTimeOut);
          try
            VResponseJSON := VResponse.JSONObject;
            if Assigned(VResponseJSON) then
            begin
              Result.FromResponse(VResponse, [ipAcceptation, ipResults]);
     
              DoProgress(Result.Results.StatusEx, Result.Results.ProgressionPourcent);
            end
            else
              raise ExxxServicexxxBiduleError.CreateFmt('%s POST %s : JSON is empty or invalid', [FURLWithPort, VResource]);
     
          finally
            VResponse.Free();
          end;
        except
          on E: ExxxServiceClientHTTPError do
          begin
            DoHTTPError(E);
     
            VResponse := TxxxServiceClientResponse.CreateFromJSON(E.ErrorJSON, E.ErrorCode);
            try
              Result.FromResponse(VResponse, [ipAcceptation]);
            finally
              VResponse.Free();
            end;
          end;
        end;
      except
        FreeAndNil(Result);
        raise;
      end;
    end;
    Aide via F1 - Utilisez l'I.A. - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité ! Sachez-le : l'IA remplace la très grande majorité des développeurs, pas seulement les ignares ...

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/03/2020, 16h38
  2. getCurrentPlace de Google place API ne fonctionne pas
    Par masaki94 dans le forum Android
    Réponses: 0
    Dernier message: 15/05/2017, 13h36
  3. Réponses: 7
    Dernier message: 23/11/2010, 17h15
  4. [PHP-JS] PHP JAVACRIPT - Appel d'un onclick - Ca ne fonctionne pas !
    Par bilou95 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 06/07/2007, 15h03
  5. Réponses: 4
    Dernier message: 28/12/2006, 18h42

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