我有没有办法以字符串形式接收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
个对象?
答案 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