浅析Web API中FromBody属性
比较如下两段代码及测试结果:
public class ValuesController : ApiController
{
// POST api/<controller>
public string Post(string value)
{
return value;
}
}
用swagger ui请求时,value的值为“1”或“a“均可返回。
public class ValuesController : ApiController
{
// POST api/<controller>
public string Post([FromBody]string value)
{
return value;
}
}
用swagger ui请求时,value的值为“1”可正确返回,但为“a”时返回值为null。
怎么回事?
显然有必要了解一下FromBody特性,见如下mscor描述。通俗点说,FromBodyAttribute要求被其修饰的参数,必须是序列化后的实体成员。
显然“a”不是序列化后的json串,而“"a"”才是。
那么,“1”与“"1"”为什么都可以呢?这是一个技术细节,我们知道,在一个实体里如果定义了数值类型的属性,则在将这个实体的对象序列化后,它的这些数值参数默认是带双引号的。而实际上,将这些数值参数的双引号去掉,同样是一个有效的json串。所以,不难理解,“1”与“"1"”是等效的json串。
#region 程序集 System.Web.Http.dll, v4.0.0.0
// D:\SourceProject\yi+.gateway\branches\trunkOLd\packages\Microsoft.AspNet.WebApi.Core.4.0.30506.0\lib\net40\System.Web.Http.dll
#endregion using System;
using System.Web.Http.Controllers; namespace System.Web.Http
{
// 摘要:
// 一个特性,该特性指定操作参数仅来自传入 System.Net.Http.HttpRequestMessage 的实体正文。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Parameter, Inherited = true, AllowMultiple = false)]
public sealed class FromBodyAttribute : ParameterBindingAttribute
{
// 摘要:
// 初始化 System.Web.Http.FromBodyAttribute 类的新实例。
public FromBodyAttribute(); // 摘要:
// 获取参数绑定。
//
// 参数:
// parameter:
// 参数说明。
//
// 返回结果:
// 参数绑定。
public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter);
}
}
最后,贴上两种情况下swagger ui的页面请求截图:


通过比较可以看到,两者的请求参数类型、curl和Request URL是有区别的:
【value参数无FromBody特性的】
value的Type是:query
Curl:curl -X POST --header 'Accept: application/json' 'http://localhost:36024/api/Values?value=a'
Request URL:http://localhost:36024/api/Values?value=a
【value参数有FromBody特性的】
value的Type是:body。这时需要选择Parameter content type,默认是application/json
Curl:curl -X POST --header 'Content-Type: application/json' --header 'Accept: text/json' -d 'a' 'http://localhost:36024/api/Values'
Request URL:http://localhost:36024/api/Values
webapi默认返回的是json格式的字符串。从swagger ui的响应域的标签“Response Body”(不是Response Value)可以看出来,为swagger的细节点赞!
浅析Web API中FromBody属性的更多相关文章
- Web Api 中Get 和 Post 请求的多种情况分析
转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用J ...
- Web API中的路由(二)——属性路由
一.属性路由的概念 路由让webapi将一个uri匹配到对应的action,Web API 2支持一种新类型的路由:属性路由.顾名思义,属性路由使用属性来定义路由.通过属性路由,我们可以更好地控制We ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)
系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现——Post(新 ...
- ASP.NET Web API中的参数绑定总结
ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单 ...
- Web Api中实现Http方法(Put,Post,Delete)
在Web Api中实现Http方法(Put,Post,Delete) 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我 ...
- ASP.NET Web API中的JSON和XML序列化
ASP.NET Web API中的JSON和XML序列化 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok ...
- 如何在ASP.NET Core Web API中使用Mini Profiler
原文如何在ASP.NET Core Web API中使用Mini Profiler 由Anuraj发表于2019年11月25日星期一阅读时间:1分钟 ASPNETCoreMiniProfiler 这篇 ...
- Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化
9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...
- ASP.NET Web API中的Controller
虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...
随机推荐
- html学习_认识html
1.HTML骨架 <html>----根标签 <head>---头标签 </head> <body>---主体标签 </body> < ...
- robot framework教程-------虫师
http://www.testclass.net/2017/09/28/happy-holidays/
- 多线程 ForkJoinPool
阅读目录 使用 背景:ForkJoinPool的优势在于,可以充分利用多cpu,多核cpu的优势,把一个任务拆分成多个“小任务”,把多个“小任务”放到多个处理器核心上并行执行:当多个“小任务”执行完成 ...
- hive归档分区
归档hive历史分区不会减少hdfs存储空间,但是可以有效减轻hadoop namenode的压力,尤其在于小文件比较多的情况下. $mkdir $HIVE_HOME/auxlib $ cp /opt ...
- day4:数据结构list
1,一直输入用户名,输入Q退出,注意用户的输入别忘了加strip,和upper不区分大小写,list最后一位添加append li = [] while 1: name = input("& ...
- wpf(第一章 基础知识)
wpf第一章基础知识:通过vs2015创建wpf程序会在引用里面多出3个核心程序集PresentationCore.PresentationFramework.WindowsBase.并且会在解决方案 ...
- 查找->静态查找表->次优查找(静态树表)
文字描算 之前分析顺序查找和折半查找的算法性能都是在“等概率”的前提下进行的,但是如果有序表中各记录的查找概率不等呢?换句话说,概率不等的情况下,描述查找过程的判定树为何类二叉树,其查找性能最佳? 如 ...
- 抽屉之Tornado实战(4)--发帖及上传图片
对于链接,点击获取标题时,本质发送ajax请求,然后去链接抓取信息,发布又是发送ajax请求 发布信息,还要有发布者的信息,并在信息表需要记录发布者的用户名,发布者的头像,发布者的id,而这些信息可以 ...
- 预备作业2 :学习基础和C语言基础调查
剑网三毒经pk心得: 看完标题的你真的没有进错,这里是博客园. 想到写这篇文章的原因一部分是自己的确没啥技能比超过90%以上的人还好,还有一部分是受到了作业提示的指引...... 如果你有类似的技能获 ...
- java 线程(四)线程安全 同步方法
package cn.sasa.demo2; import java.util.concurrent.ExecutionException; public class ThreadDemo { pub ...