如何将asp.net webapi param放在body(post)而不是URI中?

时间:2017-05-29 17:35:33

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

我正在构建一个简单的api来从db中检索帐户的余额。如果我将这个param附加到这样的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;
    }

我在邮递员中收到此错误

  

“消息”:“此资源不支持请求实体的媒体类型'multipart / form-data'。”,     “ExceptionMessage”:“没有MediaTypeFormatter可用于从媒体类型为'multipart / form-data'的内容中读取'String'类型的对象。”,     “ExceptionType”:“System.Net.Http.UnsupportedMediaTypeException”,     “StackTrace”:“在System.Net.Http.HttpContentExtensions.ReadAsAsync [T](HttpContent内容,类型类型,IEnumerable 1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable 1格式化程序,IFormatterLogger formatterLogger,CancellationToken cancellationToken)”

我确实发现这里的问题与这个问题有点相似,但是无法通过。https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api但是仍然如此。就像在这里所说的原始类型使用[FromBody]属性但仍然。

我的路线

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

在Postman Body> form-data i中输入

  

Key = accountBalance Value = DS-00001

我希望json响应为

{ “ACCOUNT_NUMBER”: “CS-0000011”, “发余下的”:7817.7}

我的邮递员输入可能有问题,或者我不是为此而做R& D但是帮助新手仍然是你的大师们的祝福。

谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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中的一项重要功能,以确定响应消息