在核心 API 中以字符串形式接收 JSON 对象 ASP.NET



有没有办法让我以字符串形式接收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不喜欢在定义为string的属性Tokenjson对象的想法。

如果我创建一个与tokenjson对象结构匹配的类,我能够接收它,但它给我带来了其他问题,更不用说所有不必要的转换了。

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

如何接收此json对象?

只需从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。

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

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

有一篇关于所有这些事情的好文章: 在核心 API 控制器中接受原始请求正文 ASP.NET 内容

相关内容

  • 没有找到相关文章

最新更新