【问题标题】:How to put the asp.net webapi param in body(post) instead of URI?如何将 asp.net webapi 参数放在 body(post) 而不是 URI 中?
【发布时间】:2017-05-29 17:35:32
【问题描述】:

我正在构建一个简单的 api 来从 db 中检索帐户的余额。如果我像这样将参数附加到 URI,它可以正常工作

http://localhost:8080/v1/api/accounts/balance?accountBalance=DS-00001

但是当我尝试在我的操作中使用 [FromBody] 从身体中获取它时

 [HttpPost]
    [ActionName("balance")]
    public string GetBalance([FromBody]string accountNumber)
    {
        var data = BusinessLayer.Api.AccountHolderApi.GetBalance(accountNumber);
        return data;
    }

我在邮递员中收到此错误

"Message": "该资源不支持请求实体的媒体类型'multipart/form-data'。", "ExceptionMessage": "没有 MediaTypeFormatter 可用于从媒体类型为 'multipart/form-data' 的内容中读取类型为 'String' 的对象。", "ExceptionType": "System.Net.Http.UnsupportedMediaTypeException", "StackTrace": " at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable1 formatters, IFormatterLogger formatterLogger, CancellationToken cancelToken)"

我确实在这里发现了与此问题模糊相似但无法解决的问题。在https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api 中看到了 tuts 但仍然如此。就像这里所说的原始类型使用 [FromBody] 属性但仍然如此。

还有我的路线

  config.Routes.MapHttpRoute("MobileBankingApi", "v1/api/{controller}/{action}");

在邮递员正文中>我输入的表单数据

Key = accountBalance Value = DS-00001

我想要 json 响应为

{"account_number":"CS-0000011","balace":7817.7}

我的邮递员输入可能有误,或者不是我没有为此进行研发,但帮助新手仍然是你们大师的祝福。

谢谢。

【问题讨论】:

    标签: c# asp.net asp.net-web-api


    【解决方案1】:

    根据我从评论中看到的,您将数据发布为{ "accountNumber":"DS-10896" }

    要在控制器中匹配这个,你需要定义一个对象,它有一个名为 accountNumber 的字符串参数并从正文中读取。

    首先,定义一个类

    public class Account
    {
        public string accountNumber { get; set; }
    }
    

    然后将其添加为主体参数

    [HttpPost]
    [ActionName("balance")]
    public string GetBalance([FromBody]Account account)
    {
        var data = BusinessLayer.Api.AccountHolderApi.GetBalance(account.accountNumber);
        return data;
    }
    

    然后,当您发布数据时,使用与现在相同的 json 结构,即{ "accountNumber":"DS-10896" }

    更新:

    要返回具有您请求的值的对象,我只需将第二个参数添加到 Account 类中

    public class Account
    {
        public string accountNumber { get; set; }
        public int balance { get; set; }
    }
    

    然后在控制器方法中填充对象值

    HttpPost]
    [ActionName("balance")]
    public IHttpActionResult GetBalance([FromBody]Account account)
    {
        account.balance = BusinessLayer.Api.AccountHolderApi.GetBalance(account.accountNumber);
        return Ok(account);
    }
    

    注意:查看IHttpActionResult,这是 Web api 中确定响应消息的绝佳功能

    【讨论】:

    • 谢谢先生。像魅力一样工作。我得到余额的 json 响应为“6000”。我希望响应为 {"account_number":"DS-000001","balace":6000 }.How to get that?对不起,如果那太蹩脚的回答或任何链接会有所帮助。谢谢先生。:)
    • @OLDMONK 更新了我的答案,为您添加了解决方案
    • 非常感谢您,先生。您真是太幸运了。再次感谢您。:)
    【解决方案2】:

    尝试在 Postman 中更改 Body 类型以将数据发送为: "raw" JSON(application/json) 而不是form-data

    这是相关的操作指南:https://www.getpostman.com/docs/requests

    【讨论】:

    • 您好先生..我将这样的数据发送为“原始”JSON(应用程序/json){“accountNumber”:“DS-10896”}没有错误,但响应只是空“”。
    • 查看下面@Marcus-h 的答案,它展示了如何正确地将控制器参数匹配到 JSON 对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多