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

Sam*_*Sam 6 asp.net json.net asp.net-web-api asp.net-core 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
}
Run Code Online (Sandbox Code Playgroud)

我的 API 方法如下所示:

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

   // Process transaction
}
Run Code Online (Sandbox Code Playgroud)

我这样做是为了 Stripe Checkout 集成,其中 Stripe 前端客户端将敏感的信用卡数据转换为他们称之为json对象的令牌。因此,在我的后端 API 中,我只想接收令牌以及几个简单的数据点,即数量和描述。

如果我将我的CreditCardTransaction类设置为上述结构,transaction最终会得到一个null值。看起来ModelBinder不喜欢jsonToken属性中定义一个对象的想法string

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

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

我如何接收这个json对象?

Set*_*Set 5

只需从Request.Body流中读取:

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

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

实际上,string如果您使用Content-Type: application/json以下方式发布,则参数类型应该可以工作:

public async Task<IActionResult> ProcessPayment([FromBody] string transaction)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

  • `Content-Type` 已经设置为 `application/json`,但由于某种原因,如果我尝试接收 `string`,它不起作用。我最终在 `transaction` 参数中得到一个 `null` 值。 (2认同)