首页 文章

无法使用Delphi将数据发布到Web API服务方法

提问于
浏览
0

使用Delphi在C#WEB API Web服务上执行简单的数据发布时遇到很多问题(我有Embarcadero®Delphi10.1柏林版本24.0.22858.6822)

我的Web API服务控制器如下所示

如您所见,我有一个InvoiceBreakdownParameters类,其中包含我的方法所需的参数 .

我的想法是在我的Delphi应用程序中将此对象创建为JSON字符串,然后将其传递给控制器中的方法

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

下面的代码显示了我如何发布到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;

每当我尝试调用此代码时,我都会得到

HTTP / 1.1 500内部服务器错误 .

这应该是如此简单,但它浪费了我几个小时!

我试过GetBreakdownForSessionObject和GetBreakdownForSessionObject /

谁能看到我错过的东西?

保罗

PS我已经编辑了JSON是友好的Delphi,我仍然得到同样的错误 . 这真是令人沮丧!有没有办法获得更多信息?我甚至无法从提琴手那里得到任何东西!

1 回答

  • 0

    你传递一个字符串:

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

    但是,您在此字符串中使用转义字符 . 这实际上是错误的,并使其成为无效的JSON .

    删除那些转义字符,并使它只是简单的JSON,如下所示:

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

    如果JSON中的字符串值需要它,则只需要使用它们,而不是完整的JSON本身 . 也可能是你将Pascal的语法与C#的语法混淆了 . Delphi不以相同的方式使用字符串,Delphi字符串中唯一的转义字符是 ' .


    此外,您应该将流的位置重置回 0 ,然后再将其分配给请求...

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

    如果不首先将其设置为 0 ,则实际上是发送空的后期流,因为将数据加载到流中会将位置移动到结尾 . 发送流时,它从当前位置的任何位置发送 .

相关问题