【问题标题】:How to declare a POST request in Delphi REST Datasnap?如何在 Delphi REST Datasnap 中声明 POST 请求?
【发布时间】:2020-12-21 13:36:11
【问题描述】:

我正在尝试编写一个函数,该函数将使用 JSON 或 URL 中的多个参数在我的数据库中插入信息。

我已经设法创建了一个函数,该函数将信息从我的数据库返回到客户端,但不是相反。我找到的每个示例都说明了如何创建 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 中获取的,我的 JSONstring 只包含“]}”,显然没有什么可以解析的。

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

【问题讨论】:

    标签: json delphi delphi-10.2-tokyo datasnap


    【解决方案1】:

    通过不使用函数的字符串参数,而是通过传递 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
    

    【讨论】:

    • 我在 Embarcadero REST Debugger 中测试过,效果很好。
    猜你喜欢
    • 2021-03-14
    • 2014-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 2012-07-02
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多