【问题标题】:Call .NET Core API from AngularJS using $https - 400 Bad Request使用 $https 从 AngularJS 调用 .NET Core API - 400 Bad Request
【发布时间】:2021-12-18 09:53:45
【问题描述】:

我正在尝试从 AngularJS 调用 .NET Core API。在 AngularJS 中,我正在调用这样的方法:

$http({
      method: 'POST',
      url: '/api/message/transaction/' + this.transaction.id,
      data: { "transactionJson": "hello"}
    })
    .then(function (response) {
                                var r = response;
    })

我的 .NET Core API 方法是这样的:

    [Route("~/api/message/transaction/{transactionId}")]
    [HttpPost]
    public async Task<ActionResult<DeviceEventsTransactionmsg>> PostTransaction([FromBody] string transactionJson)
    {

我收到了来自服务器的 400 Bad Request 响应。我该如何解决?

【问题讨论】:

    标签: angularjs .net-core asp.net-core-webapi


    【解决方案1】:

    从服务器返回 400 Bad Request 响应。我该如何解决?

    如您所述,要解决此问题,一种解决方案是修改操作参数,如下所示。

    public async Task<ActionResult<DeviceEventsTransactionmsg>> PostTransaction([FromBody] TransactionData transactionJson)
    {
        //...
        //code logic here
    

    TransactionData类

    public class TransactionData
    {
        public string TransactionJson { get; set; }
    }
    

    此外,我们还可以实现和使用自定义纯文本输入格式化程序,以使接受字符串类型 ACTION 参数的PostTransaction 操作方法正常工作。

    public class TextPlainInputFormatter : TextInputFormatter
    {
        public TextPlainInputFormatter()
        {
            SupportedMediaTypes.Add("text/plain");
            SupportedEncodings.Add(UTF8EncodingWithoutBOM);
            SupportedEncodings.Add(UTF16EncodingLittleEndian);
        }
    
        protected override bool CanReadType(Type type)
        {
            return type == typeof(string);
        }
    
        public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
        {
            string data = null;
            using (var streamReader = new StreamReader(context.HttpContext.Request.Body))
            {
                data = await streamReader.ReadToEndAsync();
            }
            return InputFormatterResult.Success(data);
        }
    }
    

    添加自定义格式化程序支持

    services.AddControllers(opt => opt.InputFormatters.Insert(0, new TextPlainInputFormatter()));
    

    测试结果

    【讨论】:

      【解决方案2】:

      我意识到参数的类型必须是具有名为TransactionJson的属性的类型,所以我需要定义一个新的C#类型:

      public class TransactionData() {
          public string TransactionJson
      }
      

      然后在API方法中:

      [Route("~/api/message/transaction/{transactionId}")]
      [HttpPost]
      public async Task<ActionResult<DeviceEventsTransactionmsg>> PostTransaction([FromBody] TransactionData transactionJson)
      {
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-29
        • 2020-10-01
        • 2015-04-05
        • 1970-01-01
        • 1970-01-01
        • 2014-09-30
        • 2023-03-21
        • 1970-01-01
        相关资源
        最近更新 更多