- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有这个 Controller Action :
[HttpPost]
[ActionName("aaa")]
public HttpResponseMessage aaa(Z z) //notice - no [FromBody]
{
return Request.CreateResponse(HttpStatusCode.OK, 1);
}
Z
是:
public class Z
{
public string a { get; set; }
}
但是当我通过 fiddler 发帖时:
POST http://localhost:11485/api/profiles/aaa HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Host: localhost:11485
Content-Length: 3
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8,he;q=0.6
Cache-Control: no-cache
Connection: keep-alive
a=1
我实际上可以看到它正在工作:
问题:
如果是这样,它在没有 [FromBody] 属性的情况下如何工作?我还需要/不写这个属性吗?
另外,不写这个属性的场景是什么 - 会导致问题?
最佳答案
绑定(bind)对于 MVC 和 Web API 是不同的。默认情况下,ASP.NET Web API 绑定(bind)来自请求消息正文的复杂类型和来自 URI、查询字符串等的简单类型。由于您指定了 Z
,它是一个类(复杂类型),它会填充body 中的操作方法参数,而无需指定 [FromBody]
。另一方面,如果您的请求是没有正文的 http://localhost:11485/api/profiles/aaa?z=1
,它不会自动绑定(bind)到您的复杂参数。在这种情况下,您需要像这样指定 [FromUri]
:public HttpResponseMessage aaa([FromUri]Z z)
。
另一方面,假设您的操作方法是 public HttpResponseMessage aaa(string a)
。我们现在有了 string
,这是一个简单的类型。在这种情况下,没有消息正文的 http://localhost:11485/api/profiles/aaa?a=1
将让 Web API 正确绑定(bind)参数,而无需指定 [FromUri ]
。现在,如果你想在这种情况下从 body 绑定(bind),你将需要指定 public HttpResponseMessage aaa([FromBody]string a)
。当然对于这个body必须是=1
,对于application/x-www-form-urlencoded
,没有a
的键名。
底线 - 您的参数(简单类型或复杂类型)决定了 Web API 的绑定(bind)方式。要使其与默认行为不同,您需要通过 FromUri
或 FromBody
进行告知。
附言。我上面提到的任何内容都完全适用于良好的旧 ASP.NET Web API(包括 2)。在 ASP.NET 5.0 a.k.a ASP.NET vNext 或 ASP.NET MVC 6.0 中,MVC 和 Web API 已统一。为了让它从 body 绑定(bind)复杂类型,您必须指定 [FromBody]
。
关于c# - WebApi POST 可以在没有 [FromBody] 的情况下工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27076070/
这是基本设置,我有一个 asp.net core webapi Controller (在 C# 中),具有如下的 post 函数: [HttpPost] public ActionResult Po
这是基本设置,我有一个 asp.net 核心 webapi Controller (在 c# 中),带有一个像这样的 post 函数: [HttpPost] public ActionResult P
这是 Asp.Net Webform 应用程序 这是我的 Apicontroller 中的 POST 方法 public void Post([FromBody]string value) { } 我
这可能是非常基本的东西,但我无法弄清楚我哪里出错了。 我试图从 POST 正文中获取字符串,但“jsonString”仅显示为 null。我也想避免使用模型,但也许这是不可能的。我用 PostMan
在 Web API (2) 中使用属性路由时,我希望能够自动将路由参数从 URL 获取到模型参数中。这样做的原因是我的验证是在它到达操作之前在过滤器中执行的,如果没有它,附加信息就不容易获得。 考虑以
我收到了这样的请求。 POST /API/Event?EventID=15&UserID=1&Severity=5&DeptID=1&FlowTag=CE HTTP/1.1 Content-Type:
在 ASP.NET Core(本例中为 2.1)的 Controller 中使用 [FromBody] 时,它会处理所有到指定模型的转换并确保模型有效。这意味着如果提供的输入格式错误, Control
我正在尝试传递一个包含不同数据类型的对象。我总是在 Web API 中获取 orderDetails 的空值。 但是如果这样做, purchaseOrder.Attachments = null, 然
我有一个使用 ASP.NET Core 构建的新 API,但我无法将任何数据发布到端点。 这是端点的样子: [HttpPost] [Route("StudentResults")] public as
有没有[FromBody]属性的作用?我的意思是,当我使用它时: public async Task SetUser([FromBody]User 用户) 当我使用时: public async Ta
我似乎遇到了一个有趣的 Web API 问题 - 使用这个 Controller 操作,在左大括号上设置断点来检查 thing: [HttpPut] public void Test([FromBod
这个问题在这里已经有了答案: Web api attribute routing, by content type, in dot net core 2? (1 个回答) 关闭 4 年前。 客户端可
RESTful 设计更喜欢 URL 或 [FromBody] 中的数据吗? 假设我有一个 Controller 方法: [Route("ServiceActivity({serviceActivity
我有一个应该是非常基本的场景......我觉得我之前已经做过 100 次但由于某种原因它决定不工作并将我的时间浪费在一些琐碎的事情上...... 我正在使用带有属性路由的 WebAPI(喜欢它们)。
您好,我想通过我在 Web API Controller 中的 body 变量从 C# 客户端调用 Web Api 方法一直为空。如何正确设置? 客户端: IFileService imgServic
我在 web api 中有一个新方法 [HttpPost] public ApiResponse PushMessage( [FromUri] string x, [FromUri] string y
我有一个类似于 ASP.NET MVC 4 RC Web API Parameter Binding Issue 的问题,但我正在尝试使用 [FromBody] 属性来解决它。 Fiddler 报告以
我的 body 参数始终为 null 时遇到问题。这是 Controller : [HttpPost] public async void Assign([FromUri] int[]
我可以将我的数据发送到服务器,但只有当我使用 FromBody-Attribute 时。 为什么没有使用 Post 自动从 Body 中读取 json 数据? 后端网页接口(interface) [H
当我尝试发送请求“http://localhost:1234/api/case/create?signature=123456”时来自 Postman(谷歌扩展)在正文请求中使用“表单数据”,我收到错
我是一名优秀的程序员,十分优秀!