2017-02-25 1 views
0

Je rencontre beaucoup de problèmes lors de l'exécution d'un simple post de données vers un service Web API C# WEB utilisant Delphi (J'ai Embarcadero® Delphi 10.1 Berlin Version 24.0.22858.6822)Impossible de publier des données dans la méthode de service API Web à l'aide de Delphi

Mon contrôleur de service API Web est illustré ci-dessous

Comme vous pouvez le voir, j'ai une classe InvoiceBreakdownParameters qui contient les paramètres requis pour ma méthode.

L'idée est pour cet objet à créer comme une chaîne JSON dans mon application Delphi et cela est ensuite transmis à la méthode dans le contrôleur

namespace STC.MicroServices.WebAPI.Controllers 
{ 
    using System.Web.Http; 

    public class InvoiceBreakdownParameters 
    { 
     public string SessionID { get; set; } 
     public int CustomerID { get; } 
    } 

    [RoutePrefix("api/CostCalculation")] 
    public class CostCalculationController : ApiController 
    { 
     [System.Web.Http.AcceptVerbs("POST")] 
     public string GetBreakdownForSessionObject(InvoiceBreakdownParameters parameters) 
     { 
      return "Data Obtained With parameters: " + parameters.SessionID + "CustomerID : " + parameters.CustomerID; 
     } 
    } 
} 

Le code ci-dessous montre comment je posterai au service Web

var 
    HTTP: TIdHTTP; 
    RequestBody: TStream; 
    ResponseBody: string; 
begin 
    HTTP := TIdHTTP.Create; 
    try 
    RequestBody := TStringStream.Create('{"SessionID":"sessionID","CustomerID":321,"StartDate":"02-01-2017","EndDate": "29-01-2017","MeterID":105,"InvoiceID":-282,"InvoiceNumber":"104637803"}', 
    TEncoding.UTF8); 

    HTTP.Request.ContentType := 'application/json'; 
    ResponseBody := HTTP.Post('http://127.0.0.1:56638/api/CostCalculation/GetBreakdownForSessionObject/', 
    RequestBody); 

    memo1.Text := ResponseBody; 
    memo1.Text := memo1.Text + HTTP.ResponseText; 
    finally 
    RequestBody.Free; 
    HTTP.Free; 
    end; 
end; 

Chaque fois que je tente d'appeler ce code je reçois

HTTP/1.1 500 Internal Server Error.

Cela devrait être si simple faire et pourtant il m'a gaspillé des heures!

J'ai essayé avec les deux GetBreakdownForSessionObject et GetBreakdownForSessionObject/

Quelqu'un peut-il voir quelque chose que j'ai manqué?

Paul

PS J'ai édité le JSON être Delphi amical et je reçois toujours la même erreur. C'est vraiment frustrant! N'y a-t-il aucun moyen d'obtenir plus d'informations? Je ne peux même pas obtenir quelque chose de Fiddler!

+0

Delphi n'utilise pas les caractères d'échappement dans une chaîne, les barres obliques sont en fait envoyées au service web ... – whosrdaddy

+0

J'ai corrigé le JSON et j'ai la même erreur – Paul

+0

Vous pourriez essayer d'ajouter un proxy au composant Indy. 127.0.0.1 et le port 8888 (vous pourriez aussi avoir besoin de le configurer dans fiddler, j'oublie). Cela devrait passer par le violoneux pour que vous puissiez au moins voir ce que vous envoyez. – FLDelphi

Répondre

0

Vous passez une chaîne:

'{\"SessionID\":\"sessionID\",\"CustomerID\":1}"' 

Cependant, vous utilisez des caractères d'échappement dans cette chaîne. Ceci est réellement faux, et le rendant invalide JSON.

Retirez les caractères d'échappement, et de le rendre JSON tout simplement, comme ceci:

'{"SessionID":"sessionID","CustomerID":1}"' 

Il vous suffit de les utiliser si une valeur de chaîne dans le JSON a besoin, mais pas le JSON complet lui-même. Il se peut aussi que vous ayez la syntaxe de Pascal confondue avec celle de C#. Delphi n'utilise pas les chaînes de la même manière et le seul caractère d'échappement dans les chaînes Delphi est '.


En outre, vous devriez être à réinitialisation de la position de votre flux de retour à 0 avant de l'assigner à la demande ...

RequestBody.Position := 0; 
ResponseBody := HTTP.Post('http://127.0.0.1:56638/api/CostCalculation/GetBreakdownForSessionObject/', RequestBody); 

Sans cette mise à 0 d'abord, vous envoyez en fait un vide post-stream, car le chargement de données dans un flux déplace la position jusqu'à la fin. Lorsque le flux est envoyé, il envoie de partout où se trouve la position actuelle.

+0

S'il vous plaît voir mon JSON modifié toujours obtenir la même erreur – Paul

+0

@Paul Eh bien, vous devez avoir plus d'un problème. –