转载于:https://juejin.im/post/5cdab497e51d453adf1fa729
转载于:https://blog.csdn.net/weixin_34129145/article/details/91441753

Net Core中Get请求接口的参数一般可以在url中获取,但是Post请求接口一般建议使用[FromBody]特性来绑定参数,而前端发请求时也得需要注意,前端代码如下(vue):

const postData = {
id: 12
}; // post请求的数据,可自行定义
this.$axios({
url: api.postUrl,
method: 'post',
params: postData
}).then((result) => {
this.$message({
message: '请求成功',
type: 'success',
showClose: true
});
}).catch((err) => {
this.$message({
message: '请求失败',
type: 'error',
showClose: true
});
})

后端代码如下(.Net Core)

[HttpPost]
public ActionResult HandlePost(int id) {
return Content(id);
}

FromBody特性的使用

如果使用上述方法请求,会发现id可以正常获取,因为axios以params方式提交post参数时,默认将参数放在url后面,而后端接口的参数中如果不加其他参数验证的注解,则会默认从url中寻找参数。而如果在接口的参数验证中加[FromBody]注解时,由于[FromBody]注解无法绑定简单类型的参数,因此将参数的类型改成dynamic,其中dynamic类型为动态类型,和Object类型类似,所以需要使用obj. id的方式来获取参数,即代码如下:

[HttpPost]
public ActionResult HandlePost([FromBody] dynamic obj) {
return Content(obj.id);
}

再次请求会发现后端报错415 UnSupported Media Type,因为当以params方式提交post参数时,请求头中无Content-Type字段,Axios源码中对请求做了处理,如下图:

由此可知当使用params方式提交post参数时,即data参数为空时,即使手动设置请求头的Content-Type也会被清除,所以后端代码由于无法识别Content-Type字段,导致报错415 UnSupported Media Type。 为了解决这个问题,则可以将post提交参数的方式改成data方式提交,代码如下:

const postData = {
id: 12
}; // post请求的数据,可自行定义
this.$axios({
url: api.postUrl,
method: 'post',
data: postData
}).then((result) => {
this.$message({
message: '请求成功',
type: 'success',
showClose: true
});
}).catch((err) => {
this.$message({
message: '请求失败',
type: 'error',
showClose: true
});
})

然后再次请求会发现成功返回传的id参数值。

这里需要注意的是FromBody特性只接受Content-Type为application/json的请求,只有这样参数才能正确绑定,而axios的post请求中Content-Type默认为application/json, 如果在上述前端代码中手动修改请求头为application/x-www-formencoded或者multipart/form-data,则后台接口又会报错415 UnSupported Media Type.

FromForm特性的使用

FromForm特性和FromBody特性的区别是:FromForm特性是用来绑定form-data格式中的表单数据,即Content-Type为multipart/form-data,所以前端代码应修改为如下:

let formData = new FormData();
formData.append('id', 1212);
this.$axios({
url: api.postUrl,
method: 'post',
// 手动设置Content-Type为form-data格式
headers: {
'Content-Type': 'multipart/form-data'
},
data: formData
}).then((result) => {
this.$message({
message: '请求成功',
type: 'success',
showClose: true
});
}).catch((err) => {
this.$message({
message: '请求失败',
type: 'error',
showClose: true
});
})

后端代码修改为如下

[HttpPost]
public ActionResult HandlePost([FromForm] int id) {
return Content(id);
}

FromForm特性没有对简单类型的参数进行限制,所以可以直接获取参数,当formData中有多个参数需要绑定时,可以写成如下格式:

[HttpPost]
public ActionResult HandlePost([FromForm] int id, [FromForm] string name, ....) { // 只需要增加参数的个数就可以
return Content(id);
}

axios Post请求 .Net Core中的接口以及FromBody特性和FromForm特性的使用的更多相关文章

  1. vue-cli3.x中使用axios发送请求,配合webpack中的devServer编写本地mock数据接口(get/post/put/delete)

    vue-cli3.x中使用axios发送请求,配合webpack中的devServer编写本地mock数据接口(get/post/put/delete) 手把手式笔记 Axios配置 安装 axios ...

  2. day 87 Vue学习六之axios、vuex、脚手架中组件传值

      本节目录 一 axios的使用 二 vuex的使用 三 组件传值 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 axios的使用 Axios 是一个基于 promise 的 HT ...

  3. day 84 Vue学习六之axios、vuex、脚手架中组件传值

    Vue学习六之axios.vuex.脚手架中组件传值   本节目录 一 axios的使用 二 vuex的使用 三 组件传值 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 axios的 ...

  4. ASP.NET Core 中文文档 第三章 原理(16).NET开放Web接口(OWIN)

    原文:Open Web Interface for .NET (OWIN) 作者:Steve Smith. Rick Anderson 翻译:谢炀(kiler398) 校对:孟帅洋(书缘) ASP.N ...

  5. C#调用接口注意要点 socket,模拟服务器、客户端通信 在ASP.NET Core中构建路由的5种方法

    C#调用接口注意要点   在用C#调用接口的时候,遇到需要通过调用登录接口才能调用其他的接口,因为在其他的接口需要在登录的状态下保存Cookie值才能有权限调用, 所以首先需要通过调用登录接口来保存c ...

  6. ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    ExpandoObject与DynamicObject的使用   using ImpromptuInterface; using System; using System.Dynamic; names ...

  7. Vue项目中使用Vuex + axios发送请求

    本文是受多篇类似博文的影响写成的,内容也大致相同.无意抄袭,只是为了总结出一份自己的经验. 一直以来,在使用Vue进行开发时,每当涉及到前后端交互都是在每个函数中单独的写代码,这样一来加大了工作量,二 ...

  8. 详解C#泛型(二) 获取C#中方法的执行时间及其代码注入 详解C#泛型(一) 详解C#委托和事件(二) 详解C#特性和反射(四) 记一次.net core调用SOAP接口遇到的问题 C# WebRequest.Create 锚点“#”字符问题 根据内容来产生一个二维码

    详解C#泛型(二)   一.自定义泛型方法(Generic Method),将类型参数用作参数列表或返回值的类型: void MyFunc<T>() //声明具有一个类型参数的泛型方法 { ...

  9. 在.NET Core中使用DispatchProxy“实现”非公开的接口

    原文地址:"Implementing" a non-public interface in .NET Core with DispatchProxy 原文作者:Filip W. 译 ...

  10. ASP.NET Core中如何调整HTTP请求大小的几种方式

    一.前言 一般的情况下,我们都无需调用HTTP请求的大小,只有在上传一些大文件,或者使用HTTP协议写入较大的值时(如调用WebService)才可能会调用HTTP最大请求值. 在ASP.NET Co ...

随机推荐

  1. 基于Lighthouse安装Docker

    1. 前言 在此之前小编通过各种方式介绍过自己通过服务器搭建的一些玩法,也写过一些教程,但是那些教程,现在回头来看,都是有些杂乱了,统一性不强.我就准备重新整理一下之前写的文章,并且准备重新开一个专题 ...

  2. Postman接口关联总结

    1.新建集合 打开postman,点击Collections->New Collection,页面如下: 2.新建请求 下面以获取绑定信息接口为例 接口说明: C{获取绑定信息接口} 接口地址: ...

  3. kettle介绍-Step之Write to log

    Write to log写日志介绍 写日志步骤是将输入步骤的信息打印在日志窗口,供用户直接查看 Step name:步骤的名称,在单一转换中,名称必须唯一. Log level:设置日志的显示级别. ...

  4. Sentinel源码—5.FlowSlot借鉴Guava的限流算法

    大纲 1.Guava提供的RateLimiter限流使用示例 2.Guava提供的RateLimiter简介与设计 3.继承RateLimiter的SmoothBursty源码 4.继承RateLim ...

  5. wordpress插件开发时如何通过js调用图库/媒体选择器的问题

    效果: 原文地址: wordpress插件开发通过js调用图库/媒体选择器的问题 - 搜栈网 (seekstack.cn)

  6. js获取本地图片文件的原始宽高尺寸

    <!--      关键api:URL.createObjectURL(object) object:File对象或 Blob 对象     参考:https://developer.mozil ...

  7. 【HUST】网安|操作系统实验|实验二 进程管理与死锁

    目的 1)理解进程/线程的概念和应用编程过程: 2)理解进程/线程的同步机制和应用编程: 任务 1)在Linux下创建一对父子进程. 2)在Linux下创建2个线程A和B,循环输出数据或字符串. 3) ...

  8. Font Awesome文档使用手册

    Font Awesome 字体为您提供可缩放矢量图标,它可以被定制大小.颜色.阴影以及任何可以用CSS的样式. 使用文档:https://fa4.uihtm.com/ Font Awesome 是一套 ...

  9. Python基础 - 序列结构

    有序序列: 列表.元组.字符串 无序序列: 字典.集合 可变序列: 列表.字典.集合 不可变序列: 元组.字符串 基本涉及功能: 增.删.查.改 列表:升级版数组 特点: 支持双向索引 包含若干元素的 ...

  10. Python 常用魔法方法(下)

    Python 常用魔法方法(下) 回顾 魔法方法是 Python 内置方法, 不需要我们手动调用, 它存在的目的是给 解释器 调用的. 比如我们在写 "1 + 1 " 的时候, 这 ...