参考原文链接https://www.cnblogs.com/JamelAr/,本文大部分内容是根据这位博主进行实验测试的,非常感谢分享,另外也参考了https://www.cnblogs.com/vichin/p/11928889.html。希望大家一同进步。

这一篇将使用Web Api和AJAX进行数据交互的记录,通过GET和POST请求。

本次使用的是VS2017+.NET CORE 2.1+AJAX

在实现本次测试之前,要先解决跨域问题和阐述一些概念。

跨域问题,在AJAX请求的时候无法访问,错误如下图。跨域问题具体的可以百度了解一下。

解决方案如下:

1.在ConfigureServices中添加服务

// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{ services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); services.AddCors(options => { options.AddPolicy("CorsPolicy", builder => builder.SetIsOriginAllowed((host) => true).AllowAnyMethod().AllowAnyHeader().AllowCredentials()); });
 }

2.在Configure中添加中间件。

// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseCors("CorsPolicy");//必须位于UseMVC之前
app.UseMvc();
}

这样就可以跨域访问了。

下面先对Get请求进行测试。

Get请求的实质是Url字符串的拼接。把传输的数据放在url地址中。

例如,上图中的数据就是放在url上。

1.Get请求基本类型 (参数的名字要匹配对应)

    [Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{[Route("Demo")]//这里我自己定义了路由
[HttpGet]
public string Get(int id, string name)
{
return "这是尝试Get请求";
}
}
     $.ajax({
type: "Get",
url: "http://localhost:12650/api/values/Demo",
data: { id: , name: "Jim"},
success: function (res) {
alert(res);
},
error: function (msg) {
alert(msg.responseText);
}
});

可以启动Web Api并打个断点进行查看。

可以看到AJAX传过来的值接收到了,这边返回一个字符串。

这样就完成了一次基本类型参数的请求。

2.Get不支持实体类型,刚才说了Get是字符串的拼接,所以传输的是字符串。当然了有方法可以使用[FromUri],但我觉得不太好,所以这种写法我选择不写了。

3.我们可以通过序列化和反序列化来传送数据。

我所理解的序列化和反序列化-> 序列化就是将对象Object变成Json格式,反序列化就是将得到的Json变成对象。(Json本身是字符串)

$.ajax({
type: "Get",
contentType: "application/json",
url: "http://localhost:12650/api/values/Demo",
data:{ strDemo: JSON.stringify({ “id”: , “name”: "Jim" })},//用序列化的时候将参数加上引号
success: function (res) {
alert(res);
},
error: function (msg) {
alert(msg.responseText);
}
});
 [Route("Demo")]
[HttpGet]
public string Get(string strDemo)
{
Person one = Newtonsoft.Json.JsonConvert.DeserializeObject<Person>(strDemo);
return one.ID;
}

依然打个断点看看。

反序列化后得到对象。

下图出自https://www.cnblogs.com/vichin/p/11928889.html 在本文开头已经提及。讲的非常好 所以直接引用,在此说明出处。

POST请求

Post参数传递本身是在Request-Body内传递,而Get参数传递本质是url拼接;

1.POST请求 单个基本参数的传值。

 $.ajax({
type: "post",
url: "http://localhost:12650/api/values/Demo",
data:{ "":"JACK"},//post请求,只有值没有键
success: function (res) {
alert(res);
},
error: function (msg) {
alert(msg.responseText);
}
});
[Route("Demo")]
[HttpPost]
public string Test([FromForm] string strDemo)
{
return "";
}

后台代码我尝试使用了FromBody但始终得不到值,大部分的博主也是使用的FromBody,都可以获取到。哎,这一点没有太搞懂为啥。后来按照上面的FromForm我可以成功的接到值。

程序打个断点看一下.

这个问题,目前还不知道原因。值确实通过FromForm取到了。

2.多个基础类型参数的传值。

多个基础类型参数的值,不能说在每次参数前面添加[FromBody]或者[FromForm],因为源特性无法绑定,推理会失败,它不知道如何对应。

虽然说使用实体类去接收是可以,但是如果每次来不同的基础类型参数都要创建一个相应的实体类,那岂不是很麻烦,所以使用dynamic是非常不错的选择。

 $.ajax({
type: "post",
contentType: "application/json",//内容格式为JSon
url: "http://localhost:12650/api/values/Demo",
data: JSON.stringify({ "id": , "name": "Jim" }),
success: function (res) {
alert(res);
},
error: function (msg) {
alert(msg.responseText);
}
});
[Route("Demo")]
[HttpPost]
public string Test(dynamic obj)
{
var strid = Convert.ToString(obj.id);
var strName = Convert.ToString(obj.name);
return "";
}

程序打个断点看一下.

属性名字必须和传过来的形参名字相匹配,相同,否则无法收到值。

这样通过JSON字符串的传值方式更加友好,符合键值对,所以不管一个还是多个基础类型都可以使用该方法。

3.POST请求 实体作为参数。

将实体的JSON对象发送给后台,理论上也可以成功接收的,有博主实现了,可我没有试出来= =,所以将实体作为算数我使用如下方法。

JS代码和上面多个基本类型传参相同不在贴代码了= =

程序打个断点看一下.

尝试成功。

4.POST请求 实体和基础类型作为参数。

$.ajax({
type: "post",
contentType: "application/json",
url: "http://localhost:12650/api/values/Demo",
data: JSON.stringify({"PHONE":"","Demo":{ "ID": "", "NAME": "Jim" }}),
success: function (res) {
alert(res);
},
error: function (msg) {
alert(msg.responseText);
}
});

打个断点看看。

尝试成功。

5.POST请求实体集合

var arr=[
{ "ID": "", "NAME": "Jim" },
{ "ID": "", "NAME": "JACK" },
{ "ID": "", "NAME": "Deer" }
];
$.ajax({
type: "post",
contentType: "application/json",
url: "http://localhost:12650/api/values/Demo",
data: JSON.stringify(arr),
success: function (res) {
alert(res);
},
error: function (msg) {
alert(msg.responseText);
}
});

打个断点

成功获取。

PUT 和DELETE不在赘述感觉差不多。

如果不是AJAX请求,而是后台Http请求用如下方法。

public void TestReques()
    {
     //请求路径
string url = "http://localhost:27221/api/Charging/SaveData"; //定义request并设置request的路径
WebRequest request = WebRequest.Create(url);
request.Method = "post"; //初始化request参数
string postData = "{ ID: \"1\", NAME: \"Jim\", CREATETIME: \"1988-09-11\" }"; //设置参数的编码格式,解决中文乱码
byte[] byteArray = Encoding.UTF8.GetBytes(postData); //设置request的MIME类型及内容长度
request.ContentType = "application/json";
request.ContentLength = byteArray.Length; //打开request字符流
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, , byteArray.Length);
dataStream.Close(); //定义response为前面的request响应
WebResponse response = request.GetResponse(); //获取相应的状态代码
Console.WriteLine(((HttpWebResponse)response).StatusDescription); //定义response字符流
dataStream = response.GetResponseStream();
StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();//读取所有
Console.WriteLine(responseFromServer);
    }

C#请求

最后总结一下,纯个人观点,在本次测试中很多应该出现的效果并没有出现,感觉也是怪怪的,原理也不是很清楚,但通过某种方法总算也是能够获取到所需要的值了。在Get请求中基本类型可以直接通过JSON键值对即JSON对象的形式发送,这个形式和发送给一般处理程序的data格式一模一样。也可以通过序列化和反序列化来实现传送,值得注意的是contentType:'application/json',当我们使用了这句话。那么发送给后台的数据必须是以JSON字符串的形式,即序列化之后的结果。所以这句话搭配JSON.Stringify()使用。本次的Web api测试让我对JSON有了更加清楚的了解。POST请求发送给后台也基本都是JSON字符串形式,FromBody我觉得这个参数源特性会自动反序列化,个人观点= =。最后FromBody特性接收传送过来的复杂类型只能是一个,如果是多个会推测错误,将无法得到数据。特性源HTTPGET,HTTPPOST等最好加上。最后,再次感谢本文开头两位博主的原文。

PS:post 直接用string传值 使用无Json格式 也可以

Web Api(4)的更多相关文章

  1. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  2. bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序

    也许单页程序(Single Page Application)并不是什么时髦的玩意,像Gmail在很早之前就已经在使用这种模式.通常的说法是它通过避免页面刷新大大提高了网站的响应性,像操作桌面应用程序 ...

  3. Hello Web API系列教程——Web API与国际化

    软件国际化是在软件设计和文档开发过程中,使得功能和代码设计能处理多种语言和文化习俗,在创建不同语言版本时,不需要重新设计源程序代码的软件工程方法.这在很多成熟的软件开发平台中非常常见.对于.net开发 ...

  4. ASP.NET Web API 跨域访问(CORS)

    一.客户端用JSONP请求数据 如果你想用JSONP来获得跨域的数据,WebAPI本身是不支持javascript的callback的,它返回的JSON是这样的: {"YourSignatu ...

  5. Web Api 入门实战 (快速入门+工具使用+不依赖IIS)

    平台之大势何人能挡? 带着你的Net飞奔吧!:http://www.cnblogs.com/dunitian/p/4822808.html 屁话我也就不多说了,什么简介的也省了,直接简单概括+demo ...

  6. Web APi之认证(Authentication)两种实现方式【二】(十三)

    前言 上一节我们详细讲解了认证及其基本信息,这一节我们通过两种不同方式来实现认证,并且分析如何合理的利用这两种方式,文中涉及到的基础知识,请参看上一篇文中,就不再叙述废话. 序言 对于所谓的认证说到底 ...

  7. angular2系列教程(八)In-memory web api、HTTP服务、依赖注入、Observable

    大家好,今天我们要讲是angular2的http功能模块,这个功能模块的代码不在angular2里面,需要我们另外引入: index.html <script src="lib/htt ...

  8. 我这么玩Web Api(二):数据验证,全局数据验证与单元测试

    目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试   一.模型状态 - ModelState 我理解 ...

  9. 我这么玩Web Api(一):帮助页面或用户手册(Microsoft and Swashbuckle Help Page)

    前言 你需要为客户编写Api调用手册?你需要测试你的Api接口?你需要和前端进行接口对接?那么这篇文章应该可以帮到你.本文将介绍创建Web Api 帮助文档页面的两种方式,Microsoft Help ...

  10. [译] 在Web API 2 中实现带JSON的Patch请求

    原文链接:The Patch Verb in Web API 2 with JSON 我想在.NET4.6 Web API 2 项目中使用Patch更新一个大对象中的某个字断,这才意识到我以前都没有用 ...

随机推荐

  1. Pandas导入导出&pickle文件模块

    Pandas可以读取与存储的文件格式有很多 像csv,excel,json,html等,详细请看官方文档https://pandas.pydata.org/pandas-docs/stable/use ...

  2. day20 logging模块、re模块

    今日内容: 1.logging模块 2.re模块 1.logging模块 -- 什么是logging模块 -- logging模块是用来进行记录日志的模块,主要作用是将想要输出的日志进行分级,然后以不 ...

  3. Opencv 简单视频播放器

    // C++ header and namespace #include <iostream> #include <string> #include <cstdlib&g ...

  4. visio给任意图形进行填充

    使用visio给图形填充颜色的条件:图形必须是封闭的!!! 但是很多人不明白:我明明画的图形是封闭的啊!可是无法填充颜色!这是因为,你画了一个看上去是封闭的图形,但是VISIO认为你画的不是封闭图形! ...

  5. Elastic Search 分布式架构分析

    1 ES分布式机制的透明隐藏特性ES本身就是一个分布式系统,就是为了处理海量数据的应用.ES隐藏了复杂的分布式机制,简化了配置和操作的复杂度.ES在现在的互联网环境中,盛行的原因,主要的核心就是分布式 ...

  6. Codeforces 1239C. Queue in the Train

    传送门 事实上就是模拟 搞一个优先队列维护一下事件结构体:时间,人的编号,入队还是出队 再维护两个 $set$ ,队列内的人 $inQueue$ ,想要进入队列内的人 $want$ 然后模拟模拟模拟! ...

  7. 牛客 40E 珂朵莉的数论题

    大意: 给定$x,y$, 求第$x$小的最小素因子为$y$的数, 若答案>1e9输出0. 若$y>=60$, 可以暴力筛出1e9/60以内的答案. 否则容斥+二分算出答案. #includ ...

  8. 怎样使用 Vue 的监听属性 watch ?

    需求: 我需要在某个数据变化时能够执行特定的动作, 比如我在输入框中输入数字 88, 系统检测到以后就会弹窗 拜拜 , 而输入其他字符则不会触发, 这种需求简直多入牛毛, 实际上这就是 自定义事件 , ...

  9. 区间dp 括号匹配问题

    这道题目能用区间dp来解决,是因为一个大区间的括号匹配数是可以由小区间最优化选取得到(也就是满足最优子结构) 然后构造dp 既然是区间类型的dp 一般用二维 我们定义dp[i][j] 表示i~j这个区 ...

  10. Navicat 12的安装与使用(附加破解)

    地址https://blog.csdn.net/tomos428/article/details/80483450?tdsourcetag=s_pctim_aiomsg