ASP.NET MVC-WebAPI请求

news2024/12/22 19:44:49

一、无参数Get请求

  一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现:

  请求的后台Action方法仍为上篇文章中的GetUser() :

  也可以用$.ajax({type:"get"}) 方式,正确的获得了返回数据:

二、传递一个参数的Get请求

  通常我们需要传递参数只需要指定ajax方法的data属性即可: data:{"name":"赵大宝"} 

  后台正确的返回数据:

三、传递两个或多个参数的Get请求

  按照上面的方法,对于多个参数我们可以很容易就写出来: data:{"name":"赵大宝","age":12}

   后台正确的返回数据:

四、无参数的Post请求

  我们可以使用$.post() 或$.ajax({type:"post"}) 来发起post请求:

  后台正确的返回了数据:

五、传递一个参数的Post请求:

  首先这里需要提醒大家一下,我们在修改完后台代码后,如果没有重新生成项目,那么在请求时就会报错:“未找到与请求***匹配的HTTP资源” :

  所以,我们只要我们修改了后台代码,就一定要重新生成一下:

  不过,当我们重新生成项目,再次发送请求,看到的仍然是404错误,再次检查一番代码,也没有发现是哪里的问题。

  事实上,ASP.NET Web API能够正确的识别我们的UserController控制器处理Post /api/user ,但却不能找到一个可以接受的方法来处理请求。

也就是说,Web API接收到的请求能够找到User控制器,但在该控制器中找不到名称为Def 的这个Action。

那我们要怎么来解决呢?

通过搜索MSDN上Web API官网中的说明,我们可以找到下面的一段介绍:

在Action 方法中我们需要使用 [FromBody] 属性标签来标明属性

  修改后,再次发送请求,我们可以看到,Status Code 为200,请求发送成功。

  可以看到,在post请求中,方法的参数必须要用 [FromBody] 属性来修饰才可以, [FromBody] 就告诉Web API 要从post请求体重去获取参数的值。

但让我们诧异的却是,后台返回的数据中name的值为空。

  通过调试,我们可以看到,后台Action 中接收到的name值为null。

  通过上面的测试我就也能够猜测到,Web API 要求请求传递的 [FromBody] 参数,肯定是有一个特定的格式,才能被正确的获取到。而这种特定的格式并不是我们常见的 key=value 的键值对形式。Web API 的模型绑定器希望找到 [FromBody] 里没有键名的值,也就是说, 不是 key=value ,而是 =value 。

现在,咱们把data中的key设置为空,然后再次发送请求:

  测试可见,后台正确的接收到了数据:

 六、传递两个参数的Post请求

  按理说,一个参数的请求实现了,那么传递两个或者多个参数也就很顺利了,对于两个参数的后台接收方法,我们可能会这样来写:

但事实证明,这样是错误的。

那到底两个或者多个参数我们要怎样来定义呢?

再次查看官网中的介绍,我们了解到:

  也就是说,[FromBody] 修饰的参数只能有一个。我们需要对传递的多个参数进行封装才行。

这里,我们可以将 Name和 Age 封装成一个Student 类:

  前台页面再次发送请求:

  Status Code为200,请求成功,并正确获取到后台返回的数据:

  这里,我们通过上面图片中的请求头数据可以看到,Form Data 的格式是 key=value&key=value 这种表单数据格式 Name=%E8%B5%B5%E5%A4%A7%E5%AE%9D&Age=13 ,我们平时使用的比较多的一般为json格式。 这里,我们使用 JSON.stringify() 来序列化数据。

再次发送请求:

  可以看到,From Data 中数据的格式为json字符串,Status Code为200,请求正确,但结果又出错了,后台又没有接收到数据参数:

那么问题到底出在哪呢?

  我们再次查看上图中请求头内容,注意到,虽然我们传递的数据格式是json字符串,但请求头中的Content-type 却为 

application/x-www-form-urlencoded ,并不是json格式对于的 application/json 。 而编码格式 application/x-www-form-urlencoded 表示的是:窗体数据被编码为名称/值对。 

  这里,也就是我想要说的一个注意点。平时我们在使用json数据的时候,很容易就忘记了 要指定 Content-type 为 "application/json" ,所以就容易导致很多“想不到”的错误。

所以,我们在 $.ajax() 中指定 Content-type :

  这次,后台正确的接收并返回了数据:

七、传递多个参数的Post请求

  有了上面的经验,传递多个参数的post请求我们就很容易能写出来了:

后台接收并返回数据:

八、传递多个不同对象的Post请求

  有时候我们还会遇到需要传递多个不同对象参数的情况,对于这种特殊的情况在 Json.Net 中为我们提供了一个 名为 JObject 的通用对象容器,我们可以通过 .对象名 的方式来动态的遍历参数里面的属性的值,然后动态的转换和json类型中对应的属性类型。

比如:

后台调试,通过dynamic 动态转换获取属性的值:

后台正确的返回了数据:

九、获取不同类型的数据

  一般我们获取到后台返回的数据格式类型为 json格式,我们也可以指定 请求头中的输出类型来获得不同的返回类型数据:

指定输出类型为xml格式:

指定输出类型为 json格式:

  基本到这里,这篇文章的主要内容也就算说完了,其中的重点还是 Post请求中对于参数的处理是需要重点注意的。

  上面我们在测试的过程中,都是通过自己创建的Controller控制器类来对参数进行接收处理,可能有人会问,我们这么写到底是否符合规范呢,Web API中默认是怎么来处理的呢? 这里,Visual Studio 中也为我们自带了 Web API控制器类:

我们可以添加新建项选择 Web API控制器类 即可:

  这里我们可以看到,默认创建的Controller控制器类中,对于Post请求的Action方法都自带了 [FromBody] 属性。 现在不用我说,你也已经知道为什么 它会为参数默认带一个 [FromBody]属性吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/531198.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Grafana功能菜单介绍(04)

Grafana的功能菜单设计为侧边栏(sidebar)形式,可以折叠隐藏,便于我们更加专注数据的可视化。现将菜单栏各项功能进行编号讲解,如下图所示。 ① Grafana的logo,即当前页为Grafana的Home page,在任何页面点击Grafana的logo,都会跳到Home Page。 ② 新建按钮,用于创建Da…

Camtasia Studio2023新功能及下载安装使用教程

Camtasia Studio2023新版本包含了屏幕录像、视频剪辑和编辑、视频录音配音、视频菜单制作、视频剧场和视频播放等功能。它可以在任何颜色模式下记录屏幕动作,包括影像、 音效、鼠标移动轨迹,解说声音等等;它支持视频播放和编辑压缩&#xff0…

Mars3d实现单击按钮高亮矢量对象

调用高亮的关键代码: let graphictruck new mars3d.graphic.ModelEntity({ position: [116.327881, 31.018378, 5000], style: { url: //data.mars3d.cn/gltf/mars/qiche.gltf, heading: 90, scale: 0.9, …

应用软件系统架构设计的“七种武器”

对于软件架构这一概念,有太多的版本,目前在业界由大师级人物或组织提出的对这一概念的阐述就超过十种以上,我个人比较赞同RUP(Rational Unified Process)中对软件架构的定义,即软件架构包含了关于以下问题的重要决策: …

剑指offer(C++)-JZ48:最长不含重复字符的子字符串(算法-动态规划)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 数据范围…

c++ 11标准模板(STL) std::set(四)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…

让 ChatGPT 来担任这个召之即来挥之即去的私人健身教练

健身教练 和ChatGPT聊天可以运用在各种正式、非正式&#xff0c;工作、休闲场合&#xff0c;让我们再来看一个场景&#xff0c;也是年轻人群体中非常热门的话题&#xff1a;健身。健身已经是年轻人最流行的活动&#xff0c;既可以是私密的个人健身&#xff0c;也可以是呼朋唤友…

JAVA集合,复杂度,泛型

泛型: 1.存储数据的时候 可以帮我们进行自动的类型检查 2.获取元素的时候&#xff0c;可以帮我们进行类型转换 获取数据时&#xff0c;不需要强转类型转换。 类型形参一般使用一个大写字母表示&#xff0c;常用的名称有&#xff1a; E 表示 Element K 表示 Key V 表示 …

多目标跟踪:视觉联合检测和跟踪

国内头部以自动驾驶全站技术为主线的交流学习社区&#xff08;感知、归控等&#xff09;&#xff0c;包含大量前沿论文解读、工程实践(源代码)、视频课程&#xff0c;热招岗位。欢迎加入&#xff01; 点击上方“迈微AI研习社”&#xff0c;选择“星标★”公众号 重磅干货&#…

Python每日一练(20230516) 打家劫舍 I\II\III\IV HouseRobber

目录 1. 打家劫舍 I House Robber i 2. 打家劫舍 II House Robber ii 3. 打家劫舍 III House Robber iii 4. 打家劫舍 IV House Robber iv &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

除了OA以外,只用点击按钮就能实现协同办公,靠一个工具就能实现

OA不同时期&#xff0c;不同功能 OA是办公自动化系统&#xff0c;与互联网技术的发展有着密切的联系。 很多办公场景都离不开OA协同系统。OA是办公系统&#xff0c;借助与互联网的交互性&#xff0c;开创出的一种新型的办公方式。 所以&#xff0c;说到OA软件&#xff0c;在不…

Linux 网络基础(1)基础知识、IP地址、端口、协议、网络字节序

基础知识 网络发展背景&#xff1a; 网络的划分&#xff1a;局域网&#xff08;覆盖范围在1000m以内&#xff09;、城域网&#xff08;覆盖范围在20km以内&#xff09;、广域网&#xff08;更大范围&#xff09; 组网方式&#xff1a;以太网、令牌环网.... 日常名词&#xff1a…

ChatGPT「最强竞争对手」Claude有了史诗级更新~~~百页数据一分钟读完还能做出总结

号称ChatGPT「最强竞争对手」的Claude&#xff0c;迎来史诗级更新—— 模型记忆力原地起飞&#xff0c;现在1分钟看完一本数万字的小说&#xff0c;已经是一件很理所当然的事情了。 消息一出&#xff0c;评论区直接炸了&#xff0c;网友们蜂拥而至&#xff0c;「wocao连连」&am…

报表解决方案Telerik Reporting - 轻松完成嵌入式报表开发

假设您是一名开发人员&#xff0c;思考一下您的用户将从Web报表设计器中得到什么吗&#xff1f;他们能突出异常数据吗?他们能够从头开始创建一个报告吗?让我们站在商业用户的角度&#xff0c;看看这到底是怎么回事。 Telerik Reporting Web Designer是一个多功能且用户友好的…

Redis系列--redis管道

一、前言 1、reids客户端向服务端发送命令分四步&#xff08;发送命令-命令排队-命令执行-返回结果&#xff09;&#xff0c;并监听socket返回&#xff0c;通常以阻塞模式等待服务端响应。 2、服务端处理命令&#xff0c;并将结果返回给客户端 以上两步称为&#xff1a;Roun…

榜店商城独立版禾匠队列服务测试失败问题解决方法-开启禾匠队列教程

发现很多用户在安装完成后或者在使用独立版本的过程中可能突然会遇到测试不通过,队列测试失败的情况,安装完成后输入站点域名登录到商城后台,先清理缓存然后进入“设置”-“队列服务”,按要求启动服务并测试服务是否正常运行,如果运行失败的话,如下图所示 这里狮子喵就给…

端子引脚焊接异常分析

No.1 案例概述 PCBA端子引脚焊接发生异常&#xff0c;通过对PCBA基板和端子进行一系列分析&#xff0c;定位到问题发生的原因在于共面性不良&#xff0c;且端子焊接引脚与锡膏接触程度不足导致。详细分析方案&#xff0c;请浏览文章获知。 Q:什么是共面性&#xff1f; 共面性也…

第一章 Java语言概述

一 Java知识脉络图 1.1 Java基础全程脉络图 1.2 本章专题与脉络 二 计算机的硬件与软件 2.1 计算机组成&#xff1a;硬件软件 2.2 CPU、内存与硬盘 CPU&#xff08;Central Processing Unit&#xff0c;中央处理器&#xff09; 人靠大脑思考&#xff0c;电脑靠CPU来运算、控…

LocalAI - 兼容OpenAI API的本地大模型技术栈【LLM】

LocalAI 是一个用于本地推理的 与OpenAI API 规范兼容的REST API&#xff0c; 它允许使用消费级硬件在本地或本地运行模型&#xff0c;支持llama.cpp、alpaca.cpp、gpt4all.cpp、rwkv.cpp、whisper.cpp、vicuna、koala、gpt4all-j、cerebras 等大模型。 推荐&#xff1a;用 NSD…

linux入门---模拟实现命令行解释器

目录标题 前提准备工作 前提 平时使用指令操作linux系统的时候可能会输入一些不好的指令&#xff0c;这些指令可能会对操作系统内核造成影响&#xff0c;所以就有了命令行解释器这个东西&#xff0c;它会过滤掉那些不好的指令从而让linux系统更加的安全&#xff0c;比如说我们…