web-dev-qa-db-ja.com

ASP.NET CoreAPIで文字列としてJSONオブジェクトを受信する

jsonオブジェクトを文字列として受け取り、not Web APIのクラスに変換する方法はありますか?

受け取ったjsonオブジェクトの構造に一致するクラスを作成すると、ModelBinderがそれを処理するため、すべてがうまく機能します。ただし、文字列として保持しようとすると失敗します。 transactionパラメーターの値は最終的にnullになります-以下の私のAPIメソッドを参照してください。

これは、APIメソッドにデータを受信するために使用するCreditCardTransactionクラスの外観です。

public class CreditCardTransaction
{
   public int Amount { get; set; }
   public string Description { get; set; }
   public string Token { get; set; } // This is the json object
}

そして私のAPIメソッドは次のようになります:

[HttpPost("process")]
public async Task<IActionResult> ProcessPayment([FromBody] CreditCardTransaction transaction)
{
   if(transaction == null || !ModelState.IsValid)
      return new StatusCodeResult(400);

   // Process transaction
}

Stripeフロントエンドクライアントが機密性の高いクレジットカードデータを、jsonオブジェクトであるトークンと呼ばれるものに変換するStripeCheckout統合のためにこれを行っています。そのため、バックエンドAPIでは、トークンといくつかの単純なデータポイント、つまり金額と説明を受け取りたいだけです。

CreditCardTransactionクラスを上記の構造に設定すると、transactionnull値を取得することになります。 ModelBinderは、jsonとして定義されているTokenプロパティにstringオブジェクトを含めるという考えを好まないようです。

jsontokenオブジェクトの構造に一致するクラスを作成すると、それを受け取ることができますが、不要な変換は言うまでもなく、他の問題が発生します。

トランザクションを完了するためにStripeのAPIに渡す以外は、tokenは必要ありません。保存したり操作したりしません。 StripeのAPIはとにかくjsonオブジェクトを期待しているように見えるので、私はそれを受け取り、それをいじることなくそのままAPIに渡したいだけです。

このjsonオブジェクトを受け取るにはどうすればよいですか?

4
Sam

動的キーワードを使用してみますか?ここで、動的キーワードの使用法についてのアイデアを得ることができます。 POCOクラスを定義する必要はありません。 http://www.carlserver.com/blog/post/using-c%23-dynamic-keyword-to-replace-data-transfer-objects

3
Baskar

Request.Bodyストリームから読み取るだけです:

public async Task<IActionResult> ProcessPayment()
{
    using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
    {
            string rawValue = await reader.ReadToEndAsync();
    }
    ...
}

更新:以下はASP.NET Core2.0では機能しません。

実際、Content-Type: application/jsonで投稿すると、パラメータのstringタイプが機能するはずです。

public async Task<IActionResult> ProcessPayment([FromBody] string transaction)
{
    ...
}

これらすべてについての良い記事があります: ASP.NET Core APIコントローラーでの生の要求本文コンテンツの受け入れ

3
Set