2017-02-25 9 views
0

Delphiを使用してC#Web API Webサービスにデータの簡単なポストを実行する際に多くの問題が発生しています(Embarcadero®Delphi 10.1 Berlinバージョン24.0.22858.6822)Delphiを使用してWeb APIサービスメソッドにデータを投稿できません

私の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私はDelphiが友好的であるためにJSONを編集していると私はまだ同じエラーを取得します。これは本当にイライラしています!より多くの情報を得る方法はありませんか?私はフィドラーから何も得られない!

+0

Delphiは文字列内でエスケープ文字を使用しません。スラッシュは実際にWebサービスに送信されます。 – whosrdaddy

+0

JSONを修正して同じエラーが発生しました – Paul

+0

Indyコンポーネントにプロキシを追加することがあります。 127.0.0。1とポート8888(あなたはフィドラーでそれを設定する必要があるかもしれませんが、私は忘れてしまいます)。それはあなたが少なくともあなたが送信していることを見ることができるように、それはバイダリを介して取得する必要があります。 – FLDelphi

答えて

0

あなたは文字列を渡している。

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

ただし、この文字列にエスケープ文字を使用しています。これは実際には間違っており、JSONを無効にしています。

これらのエスケープ文字を削除し、それが単なるJSON行い、このように:

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

あなただけのJSONの文字列値は、完全なJSON自体を、それを必要とするが、いない場合は、それらを使用する必要があります。また、パスカルの構文を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それでは、複数の問題があります。 –

関連する問題