Search code examples
jsondelphidelphi-10.2-tokyodatasnap

How to declare a POST request in Delphi REST Datasnap?


I'm trying to write a function that will insert informations in my database using JSON or multiple parameters in the URL.

I already managed to create a function that returns informations from my database to the client but not the other way. Every example I find explains how to creat a JSON but not how to receive it with System.JSON (Delphi 10.2)

Here is a code sample for a GET function actually working on my Datasnap :

function TDM_Test.DS_getArticles(pStock : String): string;
begin
  try
    VGOutils.PR_logs('Get all articles from table');

VGOutils.FU_CheckConnect('1234567890');

with VGOutils.SQ_temp1 do
begin
  SQL.Clear;
  SQL.Add('SELECT code, name, price, seller, departement FROM articles');
  SQL.Add('WHERE stock');
  ParamByName('stock').AsString := pStock;
  VGOutils.SQ_temp1.Open;
end;

GetInvocationMetadata().ResponseCode := 200;
GetInvocationMetadata().ResponseContent :=
  VGOutils.PR_JSON(VGOutils.SQ_temp1, ['code', 'name', 'price', 'seller']);

 except on E: Exception do
    PR_error(E.Message);
  end;

  VGOutils.PR_Disconnect;
end;

Now I need the client to send me new articles to INSERT in my database.

The only thing that I cant figure out is how to declare the function and it's parameters.

I want the client to be able to send me a JSON with this correct format

{"article":[{"code":"AAA","name":"car","price" : "10400.90", "sellers" : [{"seller1" : "Automaniac", "seller2" : "Autopro" }]}]}

Now I know how to parse it with TJSONObject.ParseJSONValue() by reading this JSON RadStudio

EDIT If this JSON string is hardcoded it works fine with ParseJSONValue but if the string is taken from the URL my JSONstring only contains "]}" and obviously there is nothing to parse.

 function TDM_Test.DS_insertArticles(pUrlJsonString: String): string;

 // Hardcoded JSON string
 jsonString := '{"article":[{"code":"AAA","name":"car","price" : "10400.90", "sellers" : [{"seller1" : "Automaniac", "seller2" : "Autopro" }]}]}';
 JSonValue := TJSONObject.ParseJSONValue(jsonString);

 // String received in url
 jsonString := pUrlJsonString;
 JSonValue := TJSONObject.ParseJSONValue(pUrlJsonString);

Solution

  • I found the way I wanted it to work by not using the string parameter of the function but instead using the Custom body by passing a JSONObject. The method is POST and the content type is application/JSON.

    function TDM_Test.DS_insertArticles(pUrlJsonObj: TJSONObject): string;
    
    JSonValue := TJSONObject.ParseJSONValue(pUrlJsonObj);
    
    // Retrieve data for database fields
    artCode  := JSONValue.GetValue<string>('article[0].code');
    artName  := JSONValue.GetValue<string>('article[0].name');
    artPrice := JSONValue.GetValue<string>('article[0].price');
    
    //... Proceed to INSERT SQL with these values