Как объявить запрос POST в Delphi REST Datasnap?

Я пытаюсь написать функцию, которая будет вставлять информацию в мою базу данных, используя JSON или несколько параметров в URL-адресе.

Мне уже удалось создать функцию, которая возвращает информацию из моей базы данных клиенту, но не наоборот. Каждый найденный мной пример объясняет, как создать JSON, но не объясняет, как его получить с помощью System.JSON (Delphi 10.2).

Вот пример кода для функции GET, действительно работающей с моим 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;

Теперь мне нужно, чтобы клиент отправлял мне новые статьи на INSERT в моей базе данных.

Единственное, что я не могу понять, это как объявить функцию и ее параметры.

Я хочу, чтобы клиент мог отправить мне JSON в этом правильном формате.

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

Теперь я знаю, как разобрать его с помощью TJSONObject.ParseJSONValue(), прочитав этот JSON RadStudio.

РЕДАКТИРОВАТЬ Если эта строка JSON жестко закодирована, она отлично работает с ParseJSONValue, но если строка берется из URL-адреса, моя строка JSON содержит только ]} и, очевидно, анализировать нечего.

 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);

person VirussInside    schedule 21.12.2020    source источник


Ответы (1)


Я нашел способ, которым я хотел, чтобы он работал, не используя строковый параметр функции, а вместо этого используя Custom body, передавая JSONObject. Метод — POST, а тип содержимого — 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
person VirussInside    schedule 29.12.2020
comment
Я протестировал его в отладчике REST Embarcadero, и он отлично работает. - person VirussInside; 29.12.2020