WebAPI路由:单字符串参数

时间:2016-06-21 15:45:01

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

所以,根据this

  
      
  • 如果参数是“简单”类型,则Web API会尝试获取该值   来自URI。简单类型包括.NET基元类型(int,   bool,double等等,加上TimeSpan,DateTime,Guid,decimal,   和字符串,以及具有可转换的类型转换器的任何类型   一个字符串。 (稍后将详细介绍类型转换器。)
  •   
  • 对于复杂类型,Web   API尝试使用媒体类型从邮件正文中读取值   格式化。
  •   

我有一个POST操作,其中一个string参数来自用户的输入,因此可以是任何字符 - 外来字符,unicode,撇号,'%20'等等!

因此我不愿意在网址中包含此参数,而[FromBody]装饰器似乎没有帮助。问题是:将单个字符串参数发布到WebAPI控制器的最佳[ a-hem ]实践是什么?

C#:

[HttpPost]
[Route("api/add")]
public void Add([FromBody]string name)
{
    // name is null :(
}

JS:

function add(name: string) {
    return this.$http.post("api/add/", name);
}

enter image description here

2 个答案:

答案 0 :(得分:1)

如果你真的想要[FromBody]装饰器,你应该考虑创建一个DTO,这样Model binder就可以从请求体中读取发布的数据并映射到这个DTO对象。

public class MyRequest
{
  public string Name { set;get;}
}

[HttpPost]
[Route("api/add")]
public void Add([FromBody]MyRequest model)
{
    //do something with model.Name
}

如果您不想创建类,可以从action方法中删除[FromBody]装饰器并保留字符串类型并将值作为查询字符串发送。

public void Add(string model)
{
    //do something with model.Name
}

$http.post('/api/add?name=Scott with a space')
    .then(function(response) {
        console.log('angular http response', response.data);
    })

答案 1 :(得分:0)

我已经通过使用angular.toJson`包装请求对象(名称)来解决这个问题:

function add(name: string) {
    return this.$http.post("api/add/", angular.toJson(name));
}