【问题标题】:WebAPI routing: single string parameterWebAPI 路由:单个字符串参数
【发布时间】:2016-10-23 06:27:12
【问题描述】:

所以,根据this

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

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

因此,我不愿意在 URL 中包含此参数,而 [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);
}

【问题讨论】:

  • 我只是尝试通过 post 请求发送简单的字符串,而没有来自角度的 [FromBody] 属性。我在请求正文中发送了我的值。它有效。您可以检查它生成的请求吗? (在浏览器或提琴手)
  • 字符串值周围没有引号,这太荒谬了!
  • 供您参考,您没有屏蔽图片中的所有 /localhost/****/ 实例:p
  • @Tsar - 你的问题解决了吗?
  • 如果没有,我有两种可能的解决方案。 1)您可以在请求负载中发送对象(例如 { name : "my requested name" })或 2)创建并使用自定义属性来处理不带引号的正文中的字符串

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


【解决方案1】:

如果你真的想要 [FromBody] 装饰器,你应该考虑创建一个 DTO,以便模型绑定器可以从请求正文中读取发布的数据并映射到这个 DTO 对象。

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

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

如果您不喜欢创建类,您可以从您的操作方法中删除 [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);
    })

【讨论】:

  • 这正是我试图避免做的事情
  • 一次性付出代价(例如,创建一个通用的MyStringParameter 对象),然后将其用于任意数量的 api 方法。
【解决方案2】:

我已经通过使用angular.toJson`将请求对象(名称)用引号括起来解决了这个问题:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 2019-11-23
    • 1970-01-01
    • 2017-07-21
    • 2017-11-03
    相关资源
    最近更新 更多