今天学习一下:WebAPI如何使用呢?

首先我们打开vs新建一个WebAPI项目,可以看到一共有这些文件夹目录

首先了解一下这些文件夹/文件的意义(按照程序启动的流程,相关的配置项就不说了),

    Global.asax:这个是程序启动的文件,内部的默认方法【Application_Start】对文件绑定、WebAPI路由、mvc控制器路由等进行注册,只会在第一个用户访问的时候运行;上网找了一下相关资料,发现可以在其中添加很多的配置方法:

          

 using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing; namespace AAAAAA.WebAPI
{
/// <summary>
/// WebApi全局设置
/// </summary>
public class WebApiApplication : System.Web.HttpApplication
{
/// <summary>
/// 第一个访问网站的用户会触发该方法. 通常会在该方法里定义一些系统变量
/// 如聊天室的在线总人数统计,历史访问人数统计的初始化等等均可在这里定义.
/// </summary>
protected void Application_Start()
{ } /// <summary>
/// 在应用程序关闭时运行的代码,在最后一个HttpApplication销毁之后执行
/// 比如IIS重启,文件更新,进程回收导致应用程序转换到另一个应用程序域
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_End(object sender, EventArgs e)
{ } /// <summary>
/// 每个用户访问网站的第一个页面时触发;
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Session_Start(object sender, EventArgs e)
{
string IP = this.Context.Request.UserHostAddress;
Session["IP"] = IP;
} /// <summary>
/// 使用了session.abandon(),或session超时用户退出后均可触发.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Session_End(object sender, EventArgs e)
{
// Session["User"]; 向数据库中记录用户退出时间
}
/// <summary>
/// 在每一个HttpApplication实例初始化的时候执行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_Init(object sender, EventArgs e)
{ } /// <summary>
/// 在应用程序被关闭一段时间之后,在.net垃圾回收器准备回收它占用的内存的时候被调用。
///在每一个HttpApplication实例被销毁之前执行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_Disposed(object sender, EventArgs e)
{ } /// <summary>
///所有没有处理的错误都会导致这个方法的执行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_Error(object sender, EventArgs e)
{
#region 记录错误日志
//Exception ex = Server.GetLastError().GetBaseException();
//StringBuilder str = new StringBuilder();
//str.Append("\r\n" + DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss"));
//str.Append("\r\n.客户信息:"); //string ip = "";
//if (Request.ServerVariables.Get("HTTP_X_FORWARDED_FOR") != null)
//{
// ip = Request.ServerVariables.Get("HTTP_X_FORWARDED_FOR").ToString().Trim();
//}
//else
//{
// ip = Request.ServerVariables.Get("Remote_Addr").ToString().Trim();
//}
//str.Append("\r\n\tIp:" + ip);
//str.Append("\r\n\t浏览器:" + Request.Browser.Browser.ToString());
//str.Append("\r\n\t浏览器版本:" + Request.Browser.MajorVersion.ToString());
//str.Append("\r\n\t操作系统:" + Request.Browser.Platform.ToString());
//str.Append("\r\n.错误信息:");
//str.Append("\r\n\t页面:" + Request.Url.ToString());
//str.Append("\r\n\t错误信息:" + ex.Message);
//str.Append("\r\n\t错误源:" + ex.Source);
//str.Append("\r\n\t异常方法:" + ex.TargetSite);
//str.Append("\r\n\t堆栈信息:" + ex.StackTrace);
//str.Append("\r\n--------------------------------------------------------------------------------------------------");
////创建路径
//string upLoadPath = Server.MapPath("~/Logs/");
//if (!System.IO.Directory.Exists(upLoadPath))
//{
// System.IO.Directory.CreateDirectory(upLoadPath);
//}
////创建文件 写入错误
//System.IO.File.AppendAllText(upLoadPath + DateTime.Now.ToString("yyyy.MM.dd") + ".log", str.ToString(), System.Text.Encoding.UTF8);
////处理完及时清理异常
//Server.ClearError();
////跳转至出错页面
//Response.Redirect("Error.html");
#endregion
} /// <summary>
/// //每次请求时第一个出发的事件,这个方法第一个执行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_BeginRequest(object sender, EventArgs e)
{
var url =Request.Url.ToString(); } /// <summary>
///在执行验证前发生,这是创建验证逻辑的起点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_AuthenticateRequest(object sender, EventArgs e)
{ } /// <summary>
/// 当安全模块已经验证了当前用户的授权时执行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_AuthorizeRequest(object sender, EventArgs e)
{ } /// <summary>
/// 当ASP.NET完成授权事件以使缓存模块从缓存中为请求提供服务时发生,从而跳过处理程序(页面或者是WebService)的执行。
///这样做可以改善网站的性能,这个事件还可以用来判断正文是不是从Cache中得到的。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_ResolveRequestCache(object sender, EventArgs e)
{ } /// <summary>
/// 读取了Session所需的特定信息并且在把这些信息填充到Session之前执行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_AcquireRequestState(object sender, EventArgs e)
{ } /// <summary>
/// 在合适的处理程序执行请求前调用
///这个时候,Session就可以用了
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{ } /// <summary>
///当处理程序完成对请求的处理后被调用。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_PostRequestHandlerExecute(object sender, EventArgs e)
{ } /// <summary>
/// 释放请求状态
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_ReleaseRequestState(object sender, EventArgs e)
{ } /// <summary>
/// 为了后续的请求,更新响应缓存时被调用
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_UpdateRequestCache(object sender, EventArgs e)
{ } /// <summary>
/// EndRequest是在响应Request时最后一个触发的事件
///但在对象被释放或者从新建立以前,适合在这个时候清理代码
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_EndRequest(object sender, EventArgs e)
{ } /// <summary>
/// 向客户端发送Http标头之前被调用
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_PreSendRequestHeaders(object sender, EventArgs e)
{ } /// <summary>
/// 向客户端发送Http正文之前被调用
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void Application_PreSendRequestContent(object sender, EventArgs e)
{ }
}
}

    App_Start:这里面主要是程序启动的时候需要进行的一下注册文件,比如路由,文件筛选什么的;

其他的就不介绍了。

打开框架默认提供的控制器【ValuesController】,可以看到内部提供了5个demo,分别是无参Get,带参Get,Post,Put,Delete的请求方式,其中Post和Put的例子参数都是带有【FromBody】特性,这里介绍一下【FromBody】和【FromUrl】;

    【FromBody】:强制接口从FormData中读取数据;

    【FromUrl】:强制接口从Uri中读取数据。

webApi的路由我们可以看到

控制器之后是直接带参数的,程序是如何根据路由找到对应的接口的呢?WebApi是遵循RESTful设计风格的,webapi会根据请求方式的不同来自动寻找对应的接口,如果一个webAPI控制器内部对于同样的请求方式有多个接口,那么webapi默认路由会找不到对应的接口而报错,如果要遵循RESTful风格,可能需要对每个业务的接口进行控制器隔离。

那么如果需要改变这种请求方式,变成和MVC类似的请求,应该如何修改呢?

我们需要将webapi添加一个路由机制:

这样我们就可以使用mvc模式的路由或者webapi默认路由进行接口的调用了。

WebApi是遵循Restful风格的,所以不建议在路由中出现action,不推荐使用和MVC控制器相同格式的路由

那么使用webapi有哪些地方需要注意呢?

    1.ajax中的type有四种方式:get(查询),post(修改),delete(删除),put(插入) 。

2.写webapi时,在后台的方法最好将特性标记号对应上[HttpGet],[HttpPost],[HttpDelete],[HttpPut]。http请求和rest风格的api如果不想在后台方法写特性,但也可以将方法名以Get开头,否则会报错。

get:若是查询数据,通过get,其实get请求会将参数拼装到url上面,而url长度是有限的

post:若是对原有数据新增和修改就用post,多用post即可。post不是将参数放在url上面的,而是放在表单上的。

3.传递的参数username名一定要相同,但是大小写可以不一样。

4.若是user={name:"张苏纳",id:123,age:'19'} 然后data:user那么在后台是接收不到的,即使在页面调试时是可以看到数据。若是想接收到的话,需要在后台写成GetUserModeuri([FormUri]Users user)。

5.基于第4的另一种方法。可以将user序列化转化为一个字符窜,然后后台接收后反序列化即可得到。data:{userString:JSON.stringify(user)}

6.(1)若是通过post请求的时候,是将数据放在from data里面的,若是传递单个参数,不要在ajax上不要写对应参数。

(2)只有不写id才能得到,与[formbody]无关。若是通过post传递实体,那么在后台可以直接拿到 ,不需要任何转化。

(3)当然也可以通过data:Json.stringify(user)      contentType:'application/json'(contentType默认是json类型的)来在后台同样得到。

(4)若是参数包含了一个实体,还有一个字符串参数data:{"User":user,"Info":info}该怎么办,可以通过引用Newtonsoft.Json.Linq的JObject类型。jObject.ToObject是一个序列化方法,将josn转化为对象。

7.dynamic动态类型,比如一个实体和一个参数放到同一个对象中,获取对象后,然后dynamic json=jData; var mm= json.user,动态类型是可以直接访问属性的。

8.put和post是一样的使用,put主要是插入数据使用。

9.delete也是一样的。

10.webapi最方便的是给前端使用。

最新文章

  1. 从一道面试题来认识java类加载时机与过程
  2. 对SIL9022/9024的配置
  3. 【python游戏编程之旅】第九篇---嗷大喵快跑小游戏开发实例
  4. webform中使用webapi,并且使用autofac
  5. AS2使用ExternalInterface
  6. QPS
  7. Linux下Hadoop的简单安装
  8. C# WinForm修改Panel边框颜色
  9. inlay检验标准
  10. HDU - 5186 - zhx&amp;#39;s submissions (精密塔尔苏斯)
  11. 关于new,delete,malloc,free的一些总结
  12. MCU实战经验:多种的按键处理
  13. node vue
  14. 离职有感(CVTE,创业公司,求职...)
  15. Js 中一系列宽度和高度的学习
  16. what&#39;s the 爬虫之基本原理
  17. Python之路,第十三篇:Python入门与基础13
  18. webpack+avalon+mmState打包方案
  19. javascript 的原型与原型链的理解
  20. [vue]组件的创建(componet)和销毁(keep-alive缓存)和父子dom同步nextTick

热门文章

  1. windows下手动安装composer
  2. 黑马vue---15、使用v-model实现简易计算器
  3. Matlab - Matlab 2016a 安装破解教程
  4. antd源码分析之——标签页(tabs 1.组件结构)
  5. 修改vscode终端样式
  6. PCD(点云数据)文件格式
  7. Win10上的媒体断开连接错误消息(找不到ip地址)
  8. 【POJ - 1703】Find them, Catch them(种类并查集)
  9. 关于python脚本头部设置#!/usr/bin/python
  10. element UI实现动态生成多级表头