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

时间:2017-02-25 23:04:56

标签: c# web-services delphi indy

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

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

以下代码显示了我如何发布到网络服务

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友好,我仍然得到同样的错误。这真是令人沮丧!有没有办法获得更多信息?我甚至无法从Fiddler那里得到任何东西!

1 个答案:

答案 0 :(得分:0)

您正在传递一个字符串:

Vexplore

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

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

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

如果JSON中的字符串值需要它,您只需要使用它们,而不是完整的JSON本身。也可能是你将Pascal的语法与C#的语法混淆了。 Delphi没有以相同的方式使用字符串,Delphi字符串中唯一的转义字符是'{"SessionID":"sessionID","CustomerID":1}"'

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

0

首先不将此设置为RequestBody.Position := 0; ResponseBody := HTTP.Post('http://127.0.0.1:56638/api/CostCalculation/GetBreakdownForSessionObject/', RequestBody); ,您实际上发送了一个空的后期流,因为将数据加载到流中会将位置移动到最后。发送流时,它从当前位置的任何位置发送。