如何在 Delphi REST Datasnap 中声明一个 POST 请求?
How to declare a POST request in Delphi REST Datasnap?
我正在尝试编写一个函数,使用 JSON 或 URL 中的多个参数在我的数据库中插入信息。
我已经设法创建了一个函数,该函数 returns 从我的数据库到客户端的信息,而不是其他方式。我找到的每个示例都解释了如何创建 JSON 但没有说明如何使用 System.JSON (Delphi 10.2)
接收它
这是实际在我的 Datasnap 上运行的 GET 函数的代码示例:
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" }]}]}
现在我知道如何通过阅读 JSON RadStudio
用 TJSONObject.ParseJSONValue()
解析它
编辑
如果此 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);
我通过不使用函数的字符串参数而是通过传递 JSONObject 使用 Custom body
找到了我希望它工作的方式。
方法是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
我正在尝试编写一个函数,使用 JSON 或 URL 中的多个参数在我的数据库中插入信息。
我已经设法创建了一个函数,该函数 returns 从我的数据库到客户端的信息,而不是其他方式。我找到的每个示例都解释了如何创建 JSON 但没有说明如何使用 System.JSON (Delphi 10.2)
接收它这是实际在我的 Datasnap 上运行的 GET 函数的代码示例:
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" }]}]}
现在我知道如何通过阅读 JSON RadStudio
用TJSONObject.ParseJSONValue()
解析它
编辑 如果此 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);
我通过不使用函数的字符串参数而是通过传递 JSONObject 使用 Custom body
找到了我希望它工作的方式。
方法是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