2017-02-25 65 views
0

使用Delphi(我有Embarcadero®Delphi 10.1 Berlin版本24.0.22858.6822)无法使用Delphi将数据发布到Web API服务方法

将数据简单地发布到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; 
     } 
    } 
} 

下面的代码显示了如何发布到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是德尔福友好,我仍然得到同样的错误。这真令人沮丧!没有办法获得更多信息吗?我甚至不能从小提琴手那里得到任何东西!然而

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

,您正在使用转义字符在此字符串:

+0

Delphi不在字符串中使用转义字符,斜杠实际上被发送到webservice ... – whosrdaddy

+0

我已更正JSON并获得相同的错误 – Paul

+0

您可以尝试向Indy组件添加代理。 127.0.0。1和端口8888(你可能还需要在提琴手中设置它,我忘记了)。这应该通过小提琴手,所以你至少可以看到你发送的东西。 – FLDelphi

回答

0

你传递一个字符串。这实际上是错误的,并使其无效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,你实际上是发送了一个空因为将数据加载到流中会将位置移动到最后。当流发送时,它从当前位置的任何地方发送。

+0

请参阅我修正的JSON仍然会得到相同的错误 – Paul

+0

@Paul那么你必须有多个问题。 –

相关问题