使用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那里得到任何东西!
答案 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);
,您实际上发送了一个空的后期流,因为将数据加载到流中会将位置移动到最后。发送流时,它从当前位置的任何位置发送。