.Net WebApi 中的 FromBody FromForm FromQuery FromHeader FromRoute
在日常后端Api开发中,我们跟前端的沟通中,通常需要协商好入参的数据类型,和参数是通过什么方式存在于请求中的,是表单(form)、请求体(body)、地址栏参数(query)、还是说通过请求头(header)。
当协商好后,我们的接口又需要怎么去接收这些数据呢?很多小伙伴可能上手就是直接写一个实体,作为 api 函数的入参,然后就愉快的编写代码了;前端调用时却报 400 错误,可以说是一脸懵;当然,很多情况下这样写是不会报错的,因为我们需要的数据,往往只会存在于一个地方,就是请求体(body),而我们的 .Net Core 又足够的强大,导致本不严谨的操作却不会发生 bug。
而当出现这样的一个需求的时候,小伙伴们思考一下应该怎么做:一个 Post 请求,参数分别放在了 地址栏(url?key=#$!fsefes&token......)、和请求体中( {“name”:"小明",""sex:"男"} );像这个需求我们的后端接口应该怎么写呢?下面我们尝试一下不严谨的做法。
首先我们定义一个实体 Info
public class Info
{
public string? Name { get; set; } public string? Sex { get; set; }
}
而又因为 Url 中的参数数量比较多,常规的一个做法,也是定义一个实体类去接收
public class Parameters
{
public string? Key { get; set; } public string? Token { get; set; } public string? Time { get; set; }
}
然后编写 Post 接口函数,非常简单
[HttpPost]
public int Post(Parameters parameters, Info info)
{
return 200;
}
我们直接 F5 把项目跑起来,你会发现,程序报错了,因为程序分不清谁跟谁了

而错误提示非常的清楚,你要使用 FromQuery 特性,现在我们给参数加上这个特性
[HttpPost]
public int Post([FromQuery]Parameters parameters, Info info)
{
return 200;
}
再次启动后,代码不报错了,我们看一下 swagger

由于我们给 parameters 参数加上了 FromQuery 的特性,所以程序就不懵了
下面给大家说下 FromBody FromForm FromQuery FromHeader FromRoute 的区别
FromBody:当请求的 content-type 为 application/json 时,可以不加上这个特性,因为当入参类型为实体类时,系统默认从请求体(body)中获取数据,在这里建议大家加上;
FromForm:当请求属于表单提交,也就是 content-type 为 application/x-www-form-urlencoded,则必须给参数加上 FromForm 特性,否者会报 400 错误;
FromQuery:获取地址烂参数,当接口参数是一个实体类时,建议必须加上该特性;
FromHeader:获取请求头参数;
FromRoute:获取路由参数,这个可能有些小伙伴会很疑惑,我贴出个代码大家就懂了:
[HttpPost("{id}")]
public int Post([FromRoute]string id, [FromQuery]Parameters parameters, Info info)
{
return 200;
}
好了,本文到此结束,感谢大佬们的观看,谢谢!
原文链接:https://www.cnblogs.com/ysmc/p/16758995.html
.Net WebApi 中的 FromBody FromForm FromQuery FromHeader FromRoute的更多相关文章
- .net WebApi中使用swagger
我在WebApi中使用swagger的时候发现会出现很多问题,搜索很多地方都没找到完全解决问题的方法,后面自己解决了,希望对于遇到同样问题朋友有帮助.我将先一步一步的演示项目中解决swagger遇到问 ...
- webApi中参数传递
webApi中参数传递 一:无参数的get方法: 前端: function GetNoParam() { //为了统一:我们都采用$.ajax({}) 方法; $.ajax({ url: '/a ...
- 在webapi中为Action使用dynamic参数实现Post方式调用
1.在webapi中使用controller/action/id的路径配置,打开文件[App_Start] -[WebApiConfig] config.Routes.MapHttpRoute( na ...
- WebApi中使用Ninject 依赖注入
之前Ninject依赖注入是在MVC中使用,最近在WebApi中使用,用之前的MVC方式发现使用接口注入,一直是Null错误,网上查询了一些资源,总结一下,以后备用. 主要分为以下几步骤: 在NuGe ...
- .NET Core WebApi中实现多态数据绑定
什么是多态数据绑定? 我们都知道在ASP.NET Core WebApi中数据绑定机制(Data Binding)负责绑定请求参数, 通常情况下大部分的数据绑定都能在默认的数据绑定器(Binder)中 ...
- .net WebApi中使用swagger生成WepApi集成测试工具
我在WebApi中使用swagger的时候发现会出现很多问题,搜索很多地方都没找到完全解决问题的方法,后面自己解决了,希望对于遇到同样问题朋友有帮助.我将先一步一步的演示项目中解决swagger遇到问 ...
- WebApi中的参数传递
在WebApi开发过程中,遇到一些客户端参数格式传输错误,经常被问到参数如何传递的一些问题,因此就用这篇博客做一下总结,肯定其它地方呢也有类似的一些文章,但是我还是喜欢通过这种方式将自己的理解记录下来 ...
- 【swagger学习】.net WebApi中使用swagger
我在WebApi中使用swagger的时候发现会出现很多问题,搜索很多地方都没找到完全解决问题的方法,后面自己解决了,希望对于遇到同样问题朋友有帮助.我将先一步一步的演示项目中解决swagger遇到问 ...
- ASP.NET Core WebAPI中使用JWT Bearer认证和授权
目录 为什么是 JWT Bearer 什么是 JWT JWT 的优缺点 在 WebAPI 中使用 JWT 认证 刷新 Token 使用授权 简单授权 基于固定角色的授权 基于策略的授权 自定义策略授权 ...
随机推荐
- Running Median_via牛客网
题目 链接:https://ac.nowcoder.com/acm/contest/28886/1002 来源:牛客网 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 65536K, ...
- Redis 5 种基本数据结构(String、List、Hash、Set、Sorted Set)详解 | JavaGuide
首发于:Redis 5 种基本数据结构详解 - JavaGuide 相关文章:Redis常见面试题总结(上) . Redis 5 种基本数据结构(String.List.Hash.Set.Sorted ...
- IO概述(概念&分类)和字节输入流+OUTputStream类&FileOutPutStream类介绍
IO概述 什么是IO 生活中,你肯定经历过这样的场景.当你编辑一个文本文件,忘记了保存,可能文件就白白编辑了.当你的电脑上插入一个U盘,可以吧一个视频,拷贝到你的电脑硬盘里,那么数据都是在哪些设备上的 ...
- Thymeleaf是什么?该如何使用。
先了解Thymeleaf是什么 1. Thymeleaf 简介 Thymeleaf 是新⼀代 Java 模板引擎,与 Velocity.FreeMarker 等传统 Java 模板引擎不同,Thyme ...
- 转:mysql保留关键字
原文链接:http://www.tuicool.com/articles/Brauq2e 从网上找了一个mysql的保留字列表,仅供参考. ADD ALL ALTER ANALYZE AND AS A ...
- 5.6 NOI模拟
\(5.6\ NOI\)模拟 明天就母亲节了,给家里打了个电话(\(lj\ hsez\)断我电话的电,在宿舍打不了,只能用教练手机打了) 其实我不是很能看到自己的\(future,\)甚至看不到高三的 ...
- 层次分明井然有条,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang包管理机制(package)EP10
Go lang使用包(package)这种概念元素来统筹代码,所有代码功能上的可调用性都定义在包这个级别,如果我们需要调用依赖,那就"导包"就行了,无论是内部的还是外部的,使用im ...
- Luogu3090 [USACO13NOV]空荡荡的摊位Empty Stalls (动态规划)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- 安装 NetworkManager(Debian最小化安装)
Debian最小化安装是没有NetworkManager 1 安装: 2 [root@debian]apt install -y netwok-manager 1 启动(查看网卡): 2 [root@ ...
- 认识Vue扩展插件
众所周知,在 Vue 开发中,实现一个功能可以有很多种方式可以选择,这依赖于 Vue 强大的功能(指令.混合.过滤.插件等),本文介绍一下插件的开发使用. Vue 插件 插件通常用来为 Vue 添加全 ...