webapi fromurl frombody
https://blog.csdn.net/QiGary/article/details/113979877
在做后台api接口时,常常涉及到Http方法访问问题,其中最基础也是最核心的就是传参问题。在基于C#的webapi项目中,其传参有两种实现方式,一种是使用[FromBody]和[FromUri]作为Http接口函数形参前缀传参,另一种是将函数的形参设置为空,使用System.Web.Http命名空间下的【HttpContext.Current.Request】获取。
第一种,使用[FromBody]和[FromUri]作为Http接口函数形参前缀传参
eg1:在url中传参访问,即后端使用[FromUri]
[Route("ParamsGetTest"), HttpGet]
public string ParamsGetTest([FromUri]string param1,[FromUri]string param2)
{
string result = "none";
return result;
}
[Route("ParamsPostTest"), HttpPost]
public string ParamsPostTest([FromUri]string param1, [FromUri]string param2)
{
string result = "none";
return result;
}
[Route("ParamsPostTest"), HttpPost]
public string ParamsPostTest()
{
string param1= HttpContext.Current.Request.Params["param1"].Trim();
string param2= HttpContext.Current.Request.Params["param2"].Trim();
return "ok";
}
此种接口允许url传参,其中,参数名【param1】和【param2】要与接口一致。访问形式如:https://localhost:44358/Test/ParamsPostTest?param1=admin¶m2=admin
在postman测试时,直接在【Params】标签页传参即可。
eg2:在Body中传参访问,即后端使用[FromBody]
//JObject 传值(推荐使用,可以转化为任意实体对象)
[Route("ParamsPostTest"), HttpPost]
public string ParamsPostTest([FromBody]JObject obj)
{
//obj任意名称
RequestBody result = null;
if (obj != null)
{
result = obj.ToObject<RequestBody>();
}
return JsonConvert.SerializeObject(result);
}
//具体实际对象直接传值 T=RequestBody
[Route("ParamsPostTest"), HttpPost]
public string ParamsPostTest([FromBody]RequestBody obj)
{
//obj任意名称
return JsonConvert.SerializeObject(obj);
}
//字符串传值 可为json串
[Route("ParamsPostTest"), HttpPost]
public string ParamsPostTest([FromBody]string obj)
{
//obj任意名称
return JsonConvert.SerializeObject(obj);
}
get方法使用与Post一致,其中,参数名【obj】任意。
在postman测试时,在【Body】标签页【x-www-form-urlencoded】和【raw】选项内,均可实现访问测试,推荐使用【raw】选项测试。
————————————————
版权声明:本文为CSDN博主「QiGary」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/QiGary/article/details/113979877
在WebAPI中,请求主体(HttpContent)只能被读取一次,不被缓存,只能向前读取的流。
举例子说明:
1. 请求地址:/?id=123&name=bob
服务端方法: void Action(int id, string name) // 所有参数都是简单类型,因而都将来自url
2. 请求地址:/?id=123&name=bob
服务端方法: void Action([FromUri] int id, [FromUri] string name) // 同上
void Action([FromBody] string name); //[FormBody]特性显示标明读取整个body为一个字符串作为参数
3. 请求地址: /?id=123
类定义:
public class Customer { // 定义的一个复杂对象类型
public string Name { get; set; }
public int Age { get; set; }
}
服务端方法: void Action(int id, Customer c) // 参数id从query string中读取,参数c是一个复杂Customer对象类戏,通过formatter从body中读取
服务端方法: void Action(Customer c1, Customer c2) // 出错!多个参数都是复杂类型,都试图从body中读取,而body只能被读取一次
服务端方法: void Action([FromUri] Customer c1, Customer c2) // 可以!不同于上面的action,复杂类型c1将从url中读取,c2将从body中读取
4.ModelBinder方式:
void Action([ModelBinder(MyCustomBinder)] SomeType c) // 标示使用特定的model binder来解析参数
[ModelBinder(MyCustomBinder)] public class SomeType { } // 通过给特定类型SomeType声明标注[ModelBidner(MyCustomBinder)]特性使得所有SomeType类型参数应用此规则
void Action(SomeType c) // 由于c的类型为SomeType,因而应用SomeType上的特性决定其采用model binding
总结:
1. 默认简单参数都通过URL参数方式传递,例外:
1.1 如果路由中包含了Id参数,则id参数通过路由方式传递;
1.2 如果参数被标记为[FromBody],则可以该参数可以为简单参数,客户端通过POST方式传递:$.ajax(url, '=value'),或者$.ajax({url: url, data: {'': 'value'}});
2. 默认复杂参数(自定义实体类)都通过POST方式传递,例外:
2.1 如果参数值被标记为[FromUri], 则该参数可以为复杂参数;
3. 被标记为[FromBody]的参数只允许出现一次, 被标记为[FromUri]的参数可以出现多次,如果被标记为[FromUri]的参数是简单参数,该标记可以去掉。
转载于:https://www.cnblogs.com/Juvy/p/3903974.html
webapi fromurl frombody的更多相关文章
- webapi frombody fromuri的参数绑定规则
在WebAPI中,请求主体(HttpContent)只能被读取一次,不被缓存,只能向前读取的流. 举例子说明: 1. 请求地址:/?id=123&name=bob 服务端方法: void Ac ...
- asp.net webapi [FromBody]string 获取不到ajax post的数据的解决方法
webapi中如下([FromBody]string jsonData: public async Task<ResItem> Post([FromBody]string jsonData ...
- WebAPI Post方法接收的FromBody一直为null
// POST api/getjson public string PostTest([FromBody]string value) { return "Got it!"; } 初 ...
- [FromBody]与[FromUrl]
我们都知道,前台请求后台控制的方法有get方法和post方法两种, get:只支持ulr传数据,不管你是手动把参数拼接在Url里面还是写在data里面,只要是用get方法,都会自动绑定到url里面的形 ...
- webApi之FromUri和FromBody区别
public Link GetLink([FromUri] FileRequest fileRequest) { if (ModelState.IsValid) { var xml = WebConf ...
- 问题:调用 ASP.Net Core WebAPI的HTTP POST方法时,从 [FromBody] 中读取的 MongoDB GeoJsonObjectModel成员总是null
问题描述: POST/PUT to ASP.Net Core with [FromBody] to a MongoDB GeoJsonObjectModel member is always null ...
- 关于ASP.NET中WEBAPI中POST请求中FromBody修饰的string类型的参数服务器端获取不到值FromBody空值的简单解决方法
其实解决办法很简单,就是POST请求的时候,来自实体的参数,content-type:application/x-www-form-urlencoded情况下,是默认按照键值对来解析的,比如param ...
- .Net WebApi 中的 FromBody FromForm FromQuery FromHeader FromRoute
在日常后端Api开发中,我们跟前端的沟通中,通常需要协商好入参的数据类型,和参数是通过什么方式存在于请求中的,是表单(form).请求体(body).地址栏参数(query).还是说通过请求头(hea ...
- 第二节:如何正确使用WebApi和使用过程中的一些坑
一. 基本调用规则 1. 前提 WebApi的默认路由规则为:routeTemplate: "api/{controller}/{id}", 下面为我们统一将它改为 routeTe ...
- C#进阶之WebAPI(二)
今天学习一下:WebAPI如何使用呢? 首先我们打开vs新建一个WebAPI项目,可以看到一共有这些文件夹目录 首先了解一下这些文件夹/文件的意义(按照程序启动的流程,相关的配置项就不说了), Glo ...
随机推荐
- [java安全基础 01]SQL+反序列化
tomcat Servlet 什么是servlet Java Servlet是运行在 Web 服务器或应用服务器上的程序.它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或 ...
- 【模板】动态树(Link Cut Tree)
模板 \(\text{Code}\) #include <cstdio> #include <iostream> #define IN inline #define RE re ...
- React Native学习笔记----React Native简介与环境安装
React Native 的基础是React, 是在 web 端非常流行的开源 UI 框架.要想掌握 React Native,先了解 React 框架本身是非常有帮助的. 一.什么是React Na ...
- Swiper第一页与最后一页禁止滑动
resistanceRatio抵抗率.边缘抵抗力的大小比例.值越小抵抗越大越难将slide拖离边缘,0时完全无法拖离. mounted: function() { let _this = this; ...
- LeetCode算法训练-贪心算法 455.分发饼干 376. 摆动序列 53. 最大子序和
欢迎关注个人公众号:爱喝可可牛奶 LeetCode算法训练-贪心算法 455.分发饼干 376. 摆动序列 53. 最大子序和 前置知识 贪心算法核心是找局部最优解,通过局部最优推导出全局最优 Lee ...
- 在Django中显示MySQL语句
在setting中添加以下内容 LOGGING = { 'version': 1, 'disable_existing_loggers': False, 'handlers': { 'console' ...
- echarts 各个配置项详细说明总结
theme = { // 全图默认背景 // backgroundColor: 'rgba(0,0,0,0)', // 默认色板 color: ['#ff7f50','#87cefa','#da70d ...
- 面试笔记1-redis
1.什么是RDB? RDB实际上是Redis的一种数据持久化机制.它每隔一段时间就会把内存中的数据写入到磁盘中的临时文件,作为快照,宕机重启之后,就会把rdb文件读取到内存中去,就可以恢复数据. 2. ...
- linux中进程和线程简单介绍
进程和线程的简单知识 进程是用来申请内核资源的,只有资源到位,进程才会进行,进程包含线程,线程是进程内部的调度单位,所以在业内有这样一句话,进程是资源分配最基本单位,线程是系统调度的最基本的单位,进程 ...
- docker swarm集群安装使用
1.安装master docker swarm init --advertise-addr 10.98.10.186 Swarm initialized: current node (qemrm3oq ...