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
クラスを上記の構造に設定すると、transaction
はnull
値を取得することになります。 ModelBinder
は、json
として定義されているToken
プロパティにstring
オブジェクトを含めるという考えを好まないようです。
json
のtoken
オブジェクトの構造に一致するクラスを作成すると、それを受け取ることができますが、不要な変換は言うまでもなく、他の問題が発生します。
トランザクションを完了するためにStripeのAPIに渡す以外は、token
は必要ありません。保存したり操作したりしません。 StripeのAPIはとにかくjson
オブジェクトを期待しているように見えるので、私はそれを受け取り、それをいじることなくそのままAPIに渡したいだけです。
このjson
オブジェクトを受け取るにはどうすればよいですか?
動的キーワードを使用してみますか?ここで、動的キーワードの使用法についてのアイデアを得ることができます。 POCOクラスを定義する必要はありません。 http://www.carlserver.com/blog/post/using-c%23-dynamic-keyword-to-replace-data-transfer-objects
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コントローラーでの生の要求本文コンテンツの受け入れ