在ASP.NET Core API

时间:2017-12-15 17:15:00

标签: asp.net asp.net-web-api asp.net-core json.net asp.net-core-webapi

我有没有办法以字符串形式接收json个对象,转换为我的Web API中的类?

如果我创建一个与我收到的json对象的结构相匹配的类,那么一切都很顺利,因为ModelBinder处理它。但是,如果我尝试将其保留为字符串,则表示失败。 transaction参数的值最终为null - 请参阅下面的API方法。

这就是我的CreditCardTransaction类看起来像我用来接收API方法的数据:

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 Checkout集成执行此操作,其中Stripe前端客户端将敏感信用卡数据转换为他们称为json对象的令牌。因此,在我的后端API中,我只想接收令牌以及一些简单的数据点,即金额和描述。

如果我将CreditCardTransaction类设置为上述结构,则transaction最终会获得null值。看起来ModelBinder似乎不想在json属性中设置Token对象,该对象定义为string

如果我创建了一个与json token对象的结构相匹配的类,我能够接收它,但它会导致其他问题,而不是提到所有不必要的转换。

我不需要token,除非将其传递给Stripe的API以完成交易。我不会保存或操纵它。看起来Stripe的API无论如何都期待一个json对象,所以我只想接收它并将其传递给它们的API而不会弄乱它。

如何收到此json个对象?

2 个答案:

答案 0 :(得分:3)

尝试使用动态关键字?您可以在这里了解有关动态关键字的用法。无需定义POCO类。 http://www.carlserver.com/blog/post/using-c%23-dynamic-keyword-to-replace-data-transfer-objects

答案 1 :(得分:2)

只需阅读Request.Body信息流:

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

更新:以下内容不适用于ASP.NET Core 2.0。

实际上,如果您使用string发帖,参数的Content-Type: application/json类型应该有效:

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

有一篇关于所有这些事情的好文章: Accepting Raw Request Body Content in ASP.NET Core API Controllers