2017-02-25 102 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那麼你必須有多個問題。 –

相關問題