我了个去

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Fiddler

Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据(指cookie,html,js,css等文件,这些都可以让你胡乱修改的意思)。 Fiddler 要比其他的网络调试器要更加简单,因为它不仅仅暴露http通讯还提供了一个用户友好的格式

Fiddler支持断点调试技术,当你在软件的菜单—rules—automatic breakpoints选项选择before request,或者当这些请求或响应属性能够跟目标的标准相匹配,Fiddler就能够暂停Http通讯,并且允许修改请求和响应。这种功能对于安全测试是非常有用的,当然也可以用来做一般的功能测试,因为所有的代码路径都可以用来演习。
通过显示所有的Http通讯,Fiddler可以轻松地演示哪些用来生成一个页面,通过统计页面(就是 Fiddler左边的那个大框)用户可以很轻松地使用多选,来得到一个WEB页面的“总重量”(页面文件以及相关js,css等)你也可以很轻松地看到你 请求的某个页面,总共被请求了多少次,以及多少字节被转化了。
用户可以加入一个Inspector插件对象,来使用.net下的任何语言来编写Fiddler扩展。RequestInspectors 和 ResponseInspectors提供一个格式规范的,或者是被指定的(用户自定义)Http请求和响应视图。
另外,通过暴露HTTP头,用户可以看见哪些页面被允许在客户端或者是代理端进行缓存。如果要是一个响应没有包含Cache-Control 头,那么他就不会被缓存在客户端。
同类的工具有: httpwatch, firebug, wireshark。

 
WebApi
新建WebApi项目,我们可以看到在Global.asax 中有这么一段代码
ublic static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }

routeTemplate: "api/{controller}/{id}",当我们需要请求webapi方法时,就必须带上api,类似:http://localhost:21162/api/person

我们定义一个PersonController,在定义一个Person类

 

        public class Person
        {
            public string ID { get; set; }
            public string Name { get; set; }
            public int Age { get; set; }
        }

 

 WebApi默认的几个方法Get() Get(string id)  Post([FromBody]Person value)  Put([FromBody]Person value)  Delete(string id)

 1.首先我们看生成好的Get方法

        // GET api/values
        public IEnumerable<Person> Get()
        {
            return new List<Person>() { new Person() {
             ID="1", Name="张三丰",Age=15
            }, new Person() {    ID="2", Name="李世民",Age=15 } };
        }

 通过browser来请求:http://localhost:21162/api/Person

也可以通过Fiddler来测试

几个参数要说明下,当点击Execute时,会自动生成Host.关于Accept设置为text/json表示返回的数据必须的json格式

看返回的的结果需要在TextView中看到

[{"ID":"1","Name":"张三丰","Age":15},{"ID":"2","Name":"李世民","Age":15}]

2.在来看下Get方法 带参数

        // GET api/values/5
        public Person Get(int id)
        {
            return new Person() { ID="3",Name="周大山",Age=19};
        }

 http://localhost:21162/api/person/5

Fiddler请求

 

3.Post方法

        // POST api/values
        public void Post([FromBody]Person value)
        {
             //可在此处接收value,进行对value的处理
        }

 

 Content-Type:text/json 表示Request内容必须为json格式。RequestBody中为post内容

4. Put方法

1、POST和PUT的请求根本区别
 
POST请求的URI表示处理该封闭实体的资源,该资源可能是个数据接收过程、某种协议的网关、或者接收注解的独立实体。然而,PUT请求中的URI表示 请求中封闭的实体-用户代理知道URI的目标,并且服务器无法将请求应用到其他资源。如果服务器希望该请求应用到另一个URI,就必须发送一个301响 应;用户代理可通过自己的判断来决定是否转发该请求。
 
HTTP/1.1没有定义一个PUT请求如何影响原始服务器的状态。
PUT请求必须遵守信息传输要求。
除非另有说明,PUT请求中的实体头部应该用于PUT创建或修改的资源上。

5. Delete方法

 // DELETE api/values/5
        public void Delete(int id)
        {
        }

 

其他

 

 

其他项目中如何调用此WebApi

 

get带参数

   HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("http://localhost:21162/");
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            string webapi = "api/Person/5?name=周大山";
            HttpResponseMessage response = client.GetAsync(webapi).Result;
            if (response.IsSuccessStatusCode)
            {
                var item = response.Content.ReadAsAsync<Person>().Result;
            }

 get不带参数

            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri("http://localhost:21162/");
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            //string webapi = "api/Person/5?name=周大山";
            string webapi = "api/Person";
            HttpResponseMessage response = client.GetAsync(webapi).Result;
            if (response.IsSuccessStatusCode)
            {
                var item = response.Content.ReadAsAsync<IEnumerable<Person>>().Result;
            }

总结,我们可以利用Fiddler工具来进行Api功能测试

 

http://localhost:21162/api/person?str1=1&str2=3 与http://localhost:21162/api/person/?str1=1&str2=3效果一样

 

关于API传参数的总结:[原文 总结的很好]http://www.cnblogs.com/Juvy/p/3903974.html

在WebAPI中,请求主体(HttpContent)只能被读取一次,不被缓存,只能向前读取的流。

举例子说明:

1. 请求地址:/?id=123&name=bob 

    服务端方法: void Action(int id, string name) // 所有参数都是简单类型,因而都将来自url

2. 请求地址:/?id=123&name=bob 

    服务端方法: void Action([FromUri] int id, [FromUri] string name) // 同上

                      void Action([FromBody] string name); //[FormBody]特性显示标明读取整个body为一个字符串作为参数

3. 请求地址: /?id=123 

    类定义:

public class Customer {   // 定义的一个复杂对象类型 
  public string Name { get; set; } 
  public int Age { get; set; } 
}

    服务端方法: void Action(int id, Customer c) // 参数id从query string中读取,参数c是一个复杂Customer对象类戏,通过formatter从body中读取

    服务端方法: void Action(Customer c1, Customer c2) // 出错!多个参数都是复杂类型,都试图从body中读取,而body只能被读取一次

    服务端方法: void Action([FromUri] Customer c1, Customer c2) // 可以!不同于上面的action,复杂类型c1将从url中读取,c2将从body中读取

4.ModelBinder方式:

void Action([ModelBinder(MyCustomBinder)] SomeType c) // 标示使用特定的model binder来解析参数

[ModelBinder(MyCustomBinder)] public class SomeType { } // 通过给特定类型SomeType声明标注[ModelBidner(MyCustomBinder)]特性使得所有SomeType类型参数应用此规则 

void Action(SomeType c) // 由于c的类型为SomeType,因而应用SomeType上的特性决定其采用model binding

 

总结:

1. 默认简单参数都通过URL参数方式传递,例外:

1.1 如果路由中包含了Id参数,则id参数通过路由方式传递;

1.2 如果参数被标记为[FromBody],则可以该参数可以为简单参数,客户端通过POST方式传递:$.ajax(url, '=value'),或者$.ajax({url: url, data: {'': 'value'}});

2. 默认复杂参数(自定义实体类)都通过POST方式传递,例外:

2.1 如果参数值被标记为[FromUri], 则该参数可以为复杂参数;

3. 被标记为[FromBody]的参数只允许出现一次, 被标记为[FromUri]的参数可以出现多次,如果被标记为[FromUri]的参数是简单参数,该标记可以去掉。

 

 

 

 

 

 

posted on 2015-08-12 13:28  Robert123456  阅读(756)  评论(0编辑  收藏  举报