zoukankan      html  css  js  c++  java
  • ASP.NET Web API实践系列09,在Fiddler和控制台中模拟GET和POST请求

    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

    1

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

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

    2

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

    3

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

    4

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

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

    5

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

    6

    以上,客户端发出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请求信息:

    7

    得到如下的服务端反馈:

    8

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

    9

    服务端返回如下:

    10

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

    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();
    
            }
    

    生成控制台项目。

    运行,得到如下:

    11

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

  • 相关阅读:
    log4j2RCE复现
    Kernel panic: VFS: Unable to mount root fs on 08:08 解决方法
    关于QEMU/KVM中无法开启eth0网卡解决方法
    20212022年寒假学习进度04
    20212022年寒假学习进度05
    每日学习
    课程总结和加分项
    每日学习
    20212022年寒假学习进度03
    20212022年寒假学习进度01
  • 原文地址:https://www.cnblogs.com/darrenji/p/4751987.html
Copyright © 2011-2022 走看看