比较如下两段代码及测试结果:

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属性的更多相关文章

  1. Web Api 中Get 和 Post 请求的多种情况分析

    转自:http://www.cnblogs.com/babycool/p/3922738.html 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用J ...

  2. Web API中的路由(二)——属性路由

    一.属性路由的概念 路由让webapi将一个uri匹配到对应的action,Web API 2支持一种新类型的路由:属性路由.顾名思义,属性路由使用属性来定义路由.通过属性路由,我们可以更好地控制We ...

  3. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【五】——在Web Api中实现Http方法(Put,Post,Delete)

    系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我们对资源的CRUD操作都是通过相应的Http方法来实现——Post(新 ...

  4. ASP.NET Web API中的参数绑定总结

    ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单 ...

  5. Web Api中实现Http方法(Put,Post,Delete)

    在Web Api中实现Http方法(Put,Post,Delete) 系列导航地址http://www.cnblogs.com/fzrain/p/3490137.html 前言 在Web Api中,我 ...

  6. ASP.NET Web API中的JSON和XML序列化

    ASP.NET Web API中的JSON和XML序列化 前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok ...

  7. 如何在ASP.NET Core Web API中使用Mini Profiler

    原文如何在ASP.NET Core Web API中使用Mini Profiler 由Anuraj发表于2019年11月25日星期一阅读时间:1分钟 ASPNETCoreMiniProfiler 这篇 ...

  8. Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化

    9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Fri ...

  9. ASP.NET Web API中的Controller

    虽然通过Visual Studio向导在ASP.NET Web API项目中创建的 Controller类型默认派生与抽象类型ApiController,但是ASP.NET Web API框架本身只要 ...

随机推荐

  1. CCPC-Wannafly Winter Camp Day4 Div1 - 咆咆咆哮 - [三分+贪心]

    题目链接:https://zhixincode.com/contest/18/problem/I?problem_id=267 题目描述 输入描述 输出描述 一行一个整数表示答案. 样例输入 1 32 ...

  2. POJ 3764 - The xor-longest Path - [DFS+字典树变形]

    题目链接:http://poj.org/problem?id=3764 Time Limit: 2000MS Memory Limit: 65536K Description In an edge-w ...

  3. C和C指针小记(十)-函数

    1.函数的定义 函数的定义就是函数体的实现. 语法: 类型 函数名(形式参数) 代码块 函数返回类型和函数名分开写是代码风格的问题,现代语言如swift返回值在函数名和参数表的后面,这样使得某些工程工 ...

  4. iOS引用类型

    强引用, 默认引用类型.被强引用指向的内存不被释放.强引用会对被引用对象的引用计数器+1,从而扩展对象的生命周期. 弱引用, 弱引用是医用特殊的引用类型.它不会增加引用计数器,因而不会扩展对象的生命周 ...

  5. 用github搭建网站

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  6. iOS中Block的用法,举例,解析与底层原理(这可能是最详细的Block解析)

    1. 前言 Block:带有自动变量(局部变量)的匿名函数.它是C语言的扩充功能.之所以是拓展,是因为C语言不允许存在这样匿名函数. 1.1 匿名函数 匿名函数是指不带函数名称函数.C语言中,函数是怎 ...

  7. Excel--数据透视图

    原文:https://ke.qq.com/course/289406 1.数据源注意项 2. 3.选中数据源操作 任意选中数据源表格中的单元格(有值得单元格),插入数据透视表 默认数据源区域就是整个表 ...

  8. threadPoolExecutor的基本解析

    线程池的构造方法中常见参数简介 corepoolsize:核心线程数,即便这里的线程处于空闲状态,也不会被回收,会一直存在线程池中 maxmumpoolsize:线程池所能容纳的最大线程数,超过这个数 ...

  9. 20165336 2017-2018-2 《Java程序设计》第8周学习总结

    20165336 2017-2018-2 <Java程序设计>第8周学习总结 教材学习内容总结 第十二章 1.程序:一段静态的代码.进程:程序的一次动态执行过程,它对应了从代码加载.执行至 ...

  10. opencv车流量统计算法

    #include "cv.h" #include <cxcore.h> #include <highgui.h> #include <cvaux.h& ...