ASP.NET Web API本质是由一个进程托管的一组类,需要宿主,这个宿主可以是ASP.NET应用程序,可以是MVC项目,可以是控制台应用程序,也可以是自己定制的宿主。

在VS2012中创建一个"ASP.NET MVC4 Web应用程序",选择"Web API"模版,会为我们自动添加一些相关组件。

App_Start下的WebApiConfig类包含一个Register方法,这在方法中完成Web API的各种配置,默认有一个路由设置:

config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

意思是说,规定的路由格式把接收到的HTTP请求映射到控制器类,并解析路由片段。

WebApiConfig类的Register静态方法终在global.asax中的Application_Start方法中被调用:

WebApiConfig.Register(GlobalConfiguration.Configuration);

还有,在App_Start下还有一个RouteConfig类,它有一个RegisterRoutes方法:

routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

也最终在global.asax中的Application_Start方法中被调用:

RouteConfig.RegisterRoutes(RouteTable.Routes);

这里的RegisterRoutes是属于ASP.NET MVC的扩展方法,需要注意的是ASP.NET MVC使用的路由类和ASP.NET Web API是完全不同的。

根据模板创建的项目中有一个ValuesController,它继承自ApiController,而ApiController实现IHTTPController这个接口,这个是ASP.NET Web API的核心。ApiController大致做的事包括:

● 选择、运行控制器方法
● 将HTTP请求消息的各元素转换成控制器方法的才做
● 将控制器方法的返回值转换城HTTP响应
● 各种筛选
● 为控制器提供上下文状态

在ValuesController的方法命名规则符合ASP.NET Web API的命名约定,即ApiController会根据HTTP方法谓词找寻对应的方法。比如,Get请求就找Get开头的方法。

创建一个名称为"GreetingController"的空的"api控制器",编写如下:

    public class GreetingController : ApiController
    {
        public string GetGreeting()
        {
            return "Hello World";
        }
    }

运行项目,在浏览器中输入:http://localhost:1790/api/greeting

HTTP调试代理工具Fiddler可以构造并执行HTTP消息,这在以后会经常使用这个工具,在这先玩下。

在"Composer"选项卡输入如下:

双击左侧列表中对应的链接。

在"Inspectors"选项卡下的"Raw"选项卡中看到如下:

ASP.NET Web API还支持内容协商,即客户端请求什么格式,服务端就返回什么格式。

比如客户端要求返回xml格式,那就在Fiddler中构建HTTP请求如下:

然后就能从服务端获取到xml格式的响应。

以上,客户端发出HTTP请求,服务端返回静态信息。

现在让ApiController返回动态信息。

在Models文件夹下创建一个类。

namespace MvcApplication1.Models
{
    public class Greeting
    {
        public string Name { get; set; }
        public string Message { get; set; }
    }
}

在控制器中写一个用来接收客户端Post请求的方法:

        public static List<Greeting> _greetings = new List<Greeting>();
        public HttpResponseMessage PostGreeting(Greeting greeting)
        {
            _greetings.Add(greeting);
            //从请求中获取一些什么
            var greetingLocation = new Uri(this.Request.RequestUri, "greeting/"+greeting.Name);
            //创建响应
            var response = this.Request.CreateResponse(HttpStatusCode.Created);
            response.Headers.Location = greetingLocation;
            return response;
        }

以上,

● HttpResponseMessage是System.Net.Http的一个核心类,用来封装响应信息。
● HttpRequestMessage也是System.Net.Http的一个核心类,用来封装请求信息。
● PostGreeting的形参是Greeting类型,背后隐藏了模型绑定机制,会根据客户端Content-Type标头信息,内部使用MediaTypeFormatter对象处理客户端信息实现模型绑定。
● Request属性类型是HttpRequestMessage。
● HttpResponseMessage的Headers属性让我们可以对标头进行细粒度的控制

再给控制器中的GetGreeting方法写一个重载方法,用来接收带参数的Get请求。

public string GetGreeting(string id)
        {
            var greeting = _greetings.FirstOrDefault(g => g.Name == id);
            return greeting.Message;
        }       

现在,在客户端模拟一个POST请求,以json格式向服务端发出HTTP请求信息:

得到如下的服务端反馈:

然后根据以上Location的值,构建如下HTTP请求:

服务端返回如下:

如果在请求处理过程出现异常该如何处理呢?

ASP.NET Web API为我们提供了HttpResponseException类。

在GetGreeting重载方法中加入处理异常的机制。

        public string GetGreeting(string id)
        {
            var greeting = _greetings.FirstOrDefault(g => g.Name == id);
            if (greeting == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return greeting.Message;
        }

以上,我们使用Fiddler模拟HTTP请求。

也可以在控制台中模拟HTTP请求。创建一个控制台项目。

在控制台项目中引入System.Net.Http组件。

        static void Main(string[] args)
        {
            var greetingServiceAddress = new Uri("http://localhost:1790/api/greeting");
            var client = new HttpClient();
            var result = client.GetAsync(greetingServiceAddress).Result;
            var greeting = result.Content.ReadAsStringAsync().Result;
            Console.WriteLine(greeting);
            Console.ReadKey();
        }

生成控制台项目。

运行,得到如下:

参考资料:ASP.NET Web API设计,from O'RELLY

转载于:https://www.cnblogs.com/darrenji/p/4751987.html

ASP.NET Web API实践系列09,在Fiddler和控制台中模拟GET和POST请求相关推荐

  1. ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API

    本篇尝试在现有的ASP.NET MVC 4 项目上增加使用ASP.NET Web API. 新建项目,选择"ASP.NET MVC 4 Web应用程序". 选择"基本&q ...

  2. 微信公众号接入web服务器,asp.net Web API 接入微信公众平台验证服务器,接收微信发送的POST请求...

    验证签名,接入微信公众平台:不能直接返回String,直接返回String微信服务器不接受. // GET: api/checkSignature/5 public HttpResponseMessa ...

  3. Asp.Net Web API 2第七课——Web API异常处理

    Asp.Net Web API 2第七课--Web API异常处理 原文:Asp.Net Web API 2第七课--Web API异常处理 前言 阅读本文之前,您也可以到Asp.Net Web AP ...

  4. ASP.NET Web API 路由对象介绍

    前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了一些微小的修改,这也是根据每个框架的特性来制定 ...

  5. ASP.NET Web API自身对CORS的支持: CORS授权检验的实施

    通过<EnableCorsAttribute特性背后的故事>我们知道:由CorsPolicyProvider提供的CorsPolicy表示目标Action采用的资源授权策略,ASP.NET ...

  6. 在ASP.NET Web API中返回错误的最佳实践

    本文翻译自:Best practice to return errors in ASP.NET Web API I have concerns on the way that we returns e ...

  7. 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程

    最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...

  8. ASP.NET Web API 提升性能的方法实践

    ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...

  9. 【Web API系列教程】1.3 — 实战:用ASP.NET Web API和Angular.js创建单页面应用程序(上)

    前言 在传统的web应用程序中,客户端(浏览器)通过请求页面来启动与服务器的通信.然后服务器处理该请求,并发送HTML页面到客户端.在随后页面上的操作中--例如,用户导航到一个链接或提交一个包含数据的 ...

  10. 【Web API系列教程】1.1 — ASP.NET Web API入门

    前言 HTTP不仅仅服务于web页面,同时也是构建暴露服务和数据的API的强大平台.HTTP有着简单.灵活和无处不在的特点.你能想到的几乎所有平台都包含有一个HTTP库,所以HTTP服务可以遍及广泛的 ...

最新文章

  1. 我们用过的linux系统
  2. javascript 中的暗物质 - 闭包
  3. Oracle学习笔记:oracle和serverver在过程sql中通过select对变量进行赋值的区别
  4. 终于换了杀毒工具(NOD32教育网升级)
  5. android游戏开发框架libgdx的使用(十五)—TWL布局
  6. php 付款,php – 接受付款最佳做法
  7. 6月6号=》80页-100页
  8. SynchronousQueue
  9. DELL LATITUDE E5510 笔记本电脑屏幕闪烁问题的解决.
  10. oracle财务系统表,EBS系统财务常用表和各表关联关系
  11. matlab 3维平滑,matlab 曲面平滑
  12. Java post请求工具类
  13. 少年张三丰java版_长这么大才知道,《少年张三丰》有两个版本,更喜欢哪一个版本...
  14. 按揭月供计算器(等额本息)
  15. 小灵通为什么会退市?
  16. 【数据分析实例】 2021年十万条厦门招聘数据分析
  17. 顺序栈的基本操作(C++实现)
  18. (HYSBZ - 4198)荷马史诗
  19. qt android图片自适应大小,Qt on Android:怎样适应不同的屏幕尺寸
  20. 关于c#:如何续订过期的ClickOnce证书?

热门文章

  1. 关于DatetTime?
  2. 良好的代码风格之if else?
  3. 360再回应Citron财务造假 双方或将升到法律层面
  4. Adhesive框架系列文章--报警服务使用实践
  5. Delphi Sql语句中值的引用
  6. C语言高效编程的几招
  7. 如何七周成为数据分析师
  8. Activiti学习笔记(六)Activiti的流程引擎API和服务
  9. 如何在 webpack 项目中使用绝对路径
  10. 遇到一个不得其解的问题。