WebAPI生成可导入到PostMan的数据

一、前言

现在使用WebAPI来作为实现企业服务化的需求非常常见,不可否认它也是很便于使用的,基于注释可以生成对应的帮助文档(Microsoft.AspNet.WebApi.HelpPage),但是比较便利和可持久化的调试官方却没有相应的集成,虽然我们可以使  用诸如Fiddler、Swagger、PostMan、HttpClient、单元测试等等来调试我们的WebAPI,但是却依然不是很方便,对于公司来说也需要有一种可以统一、可持久化、且行之有效的规范。

调试接口我希望他能达到以下3点:

1:可根据接口定义生成测试数据。

2:测试数据可持久化,便于持续迭代。

3:测试数据可共享。文本主要介绍如何利用PostMan实现这3点。

二、有哪些调试方法

目前所知道的调试方式有:

1:耳熟能详的Fiddler就不说了,功能非常强大,但不是我们想要的。

2:PostMan,使用方便且满足上面的2和3,这是一个谷歌插件(地址在这),也有App版本(https://www.getpostman.com/)推荐。

3:Swagger,已有人将其结合SwaggerUI集成到WebAPI中,Nuget上安装

install-package Swashbuckle

即可,项目地址https://github.com/domaindrivendev/Swashbuckle

4:手写HttpClient来实现,其他的还有https://github.com/wuchang/WebApiTestClient

以上这几种方法比较推荐的自然是PostMan。

三、PostMan的基本操作

我们先来看看使用PosMan的一些基本操作。

如下所示,我们定义了几个简单的方法来作为我们调试的接口。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using WebAPI2PostMan.Models;

namespace WebAPI2PostMan.Controllers
{
    /// <summary>
    ///     产品服务
    /// </summary>
    [RoutePrefix("Product")]
    public class ProductController : ApiController
    {
        private static readonly List<Product> Products = new List<Product>
        {
            new Product{Id = Guid.NewGuid(), Description = "产品描述",Name = "产品名称",Price = 123},
            new Product{Id = Guid.NewGuid(), Description = "产品描述",Name = "产品名称",Price = 124},
            new Product{Id = Guid.NewGuid(), Description = "产品描述",Name = "产品名称",Price = 125},
            new Product{Id = Guid.NewGuid(), Description = "产品描述",Name = "产品名称",Price = 126}
        };

        /// <summary>
        ///     获取所有产品
        /// </summary>
        [HttpGet, Route("All")]
        public IEnumerable<Product> Get()
        {
            return Products;
        }

        /// <summary>
        ///     获取产品
        /// </summary>
        /// <param name="id">产品编号</param>
        [HttpGet, Route("{id}")]
        public string Get(Guid id)
        {
            return "value";
        }

        /// <summary>
        ///     添加产品
        /// </summary>
        /// <param name="request">产品请求</param>
        [HttpPost, Route("")]
        public string Post(Product request)
        {
            Products.Add(request);
            return "ok";
        }
        /// <summary>
        ///     编辑产品
        /// </summary>
        /// <param name="id">产品编号</param>
        /// <param name="request">编辑后的产品</param>
        [HttpPut, Route("{id}")]
        public void Put(int id, Product request)
        {
        }
        /// <summary>
        ///     删除产品
        /// </summary>
        /// <param name="id">产品编号</param>
        [HttpDelete, Route("{id}")]
        public string Delete(Guid id)
        {
            var model = Products.FirstOrDefault(x => x.Id.Equals(id));
            Products.Remove(model);
            var result = string.Format("编号为{0}的产品删除成功!", id);
            return result;
        }
    }
}

在Nuget里添加了Microsoft.AspNet.WebApi.HelpPage之后生成的帮助文档如下图。

接下来,我们使用PostMan来调试我们定义的接口。在这里我使用插件版的PostMan作为演示。

获取所有产品这种其实直接使用浏览器访问就可以达到调试的目的,但是若有特殊Header或身份验证时就不太方便了,如下在PostMan中输入对应地址点击【Send】即可看到返回的数据及消耗的时间和HttpStatus等。

对于我们常用的我们可以点击Add to collection将其加入到Collections中便于下次测试。

接下来,我们对新增产品添加调试。

其余的类似,请求的方法类型与Http请求类型一致。

四、生成PostMan导入数据

那么,对于参数较多的接口时第一次添加参数是比较繁琐的,所以我希望能有根据接口定义生成出可以导入到PostMan中的方法,分析Postman下载出来的数据格式可见其实就是一个Json格式的文件。

那既然是Json格式的文件,我们就可以根据它所需要的格式生成。首先我们定义出需要的类,并没有包含全部的属性,APP版本有一些是否同步等属性并没有加进来,有兴趣的朋友可以研究一下。

public class PostmanCollection
 {
     public string id { get; set; }
     public string name { get; set; }
     public string description { get; set; }
     public List<string> order { get; set; }
     public long timestamp { get; set; }
     public List<PostmanRequest> requests { get; set; }
 }

 public class PostmanRequest
 {
     public string collection { get; set; }
     public string id { get; set; }
     public string name { get; set; }
     public string dataMode { get; set; }
     public List<PostmanData> data { get; set; }
     public string description { get; set; }
     public string descriptionFormat { get; set; }
     public string headers { get; set; }
     public string method { get; set; }
     public Dictionary<string, string> pathVariables { get; set; }
     public string url { get; set; }
     public int version { get; set; }
     public string collectionId { get; set; }
 }

 public class PostmanData
 {
     public string key { get; set; }
     public string value { get; set; }
     public string type {
         get { return "text"; }
     }
     public bool enabled {
         get { return true; }
     }
 }

PostMan支持从地址导入,所以我们可以定义个PostManController要根据接口定义来生成我们的Json数据。

using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
using System.Web.Http.Description;
using System.Web.Http.Results;
using Newtonsoft.Json;
using WebAPI2PostMan.Areas.HelpPage;
using WebAPI2PostMan.Models;

namespace WebAPI2PostMan.Controllers
{
    /// <summary>
    ///
    /// </summary>
    [RoutePrefix("PostMan")]
    public class PostManController : ApiController
    {
        private const string Host = "http://localhost:11488/";

        /// <summary>
        ///     获取PostMan集合
        /// </summary>
        /// <returns></returns>
        [Route("")]
        public JsonResult<PostmanCollection> GetPostmanCollection()
        {
            var collectionId = PostMan.GetId();
            var apis = Configuration.Services.GetApiExplorer().ApiDescriptions.Where(x => x.Documentation != null);
            var requests = GetPostmanRequests(apis, collectionId);
            var collection = new PostmanCollection
            {
                id = collectionId,
                name = "WebAPI2PostMan",
                description = "",
                order = requests.Select(x => x.id).ToList(),
                timestamp = 0,
                requests = requests
            };

            return Json(collection);
        }

        private List<PostmanRequest> GetPostmanRequests(IEnumerable<ApiDescription> apis, string collectionId)
        {
            return apis.Select(api => new PostmanRequest
            {
                collection = collectionId,
                id = PostMan.GetId(),
                name = api.Documentation,
                dataMode = "urlencoded",
                data = GetPostmanDatas(api),
                description = "",
                descriptionFormat = "html",
                headers = "",
                method = api.HttpMethod.Method,
                pathVariables = new Dictionary<string, string>(),
                url = Host + api.RelativePath,
                version = 2,
                collectionId = collectionId
            }).ToList();
        }

        private List<PostmanData> GetPostmanDatas(ApiDescription api)
        {
            var postmandatas = new List<PostmanData>();
            var apiModel = Configuration.GetHelpPageApiModel(api.GetFriendlyId());
            var raw = apiModel.SampleRequests.Values.FirstOrDefault();
            if (raw == null) return postmandatas;
            var pdata = JsonConvert.DeserializeObject<Dictionary<string,string>>(raw.ToString());
            postmandatas.AddRange(pdata.Select(model => new PostmanData {key = model.Key, value = model.Value}));
            return postmandatas;
        }
    }
}

主要生成代码就是获取所有接口和接口定义的参数。值得一提的是,我们可以借助Microsoft.AspNet.WebApi.HelpPage来获取SampleRequests,从而使用SampleRequests来填充我们的测试数据。

运行程序访问http://localhost:11488/PostMan 并将其导入到PostMan。

效果还是可以接受的,还有写可以拓展的地方,比如可以直接一键导入到PostMan程序中,用谷歌浏览器审查元素可以发现导入的方法是importCollectionFromUrl,在console中输入

window.open("chrome-extension://fdmmgilgnpjigdojojpjoooidkmcomcm/index.html");
pm.collections.importCollectionFromUrl("http://localhost:11488/postman");

就可以达到一键导入的目的了。但是遗憾的是,必须要在插件内调用才有效,代码匆忙,还有很多地方可以继续拓展,不过本文的目的已经达到了。

示例代码:https://github.com/yanghongjie/WebAPI2PostMan

时间: 2024-12-08 04:36:05

WebAPI生成可导入到PostMan的数据的相关文章

批量生成sqlldr文件,高速卸载数据

SQL*Loader 是用于将外部数据进行批量高速加载的数据库的最高效工具,可用于将多种平面格式文件加载到Oracle数据库.SQL*Loader支持传统路径模式以及直接路径这两种加载模式.关于SQL*Loader的具体用法可以参考Oracle Utilities 手册或者SQL*Loader使用方法.那么如何以SQL*Loader能识别的方式高效的卸载数据呢? Tom大师为我们提供了一个近乎完美的解决方案,是基于exp/imp,Datapump方式迁移数据的有力补充.本文基于此给出描述,并通过

[Asp.net]常见数据导入Excel,Excel数据导入数据库解决方案,总有一款适合你!

引言 项目中常用到将数据导入Excel,将Excel中的数据导入数据库的功能,曾经也查找过相关的内容,将曾经用过的方案总结一下. 方案一 NPOI NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它可以在没有安装Office的情况下对Word/Excel文档进行读写操作

用Aspose.Words for .NET动态生成word文档中的数据表格

1.概述 最近项目中有一个这样的需求:导出word 文档,要求这个文档的格式不是固定的,用户可以随便的调整,导出内容中的数据表格列是动态的,例如要求导出姓名和性别,你就要导出这两列的数据,而且这个文档不是导出来之后再调整而是导出来后已经是调整过了的.看到这里,您也许马上想到用模板导出!而且.NET中自带有这个组件:Microsoft.Office.Interop.Word,暂且可以满足需求吧.但这个组件也是有局限性的,例如客户端必须装 office组件,而且编码复杂度高.最麻烦的需求是后面那个-

MySQL 之 导入外部SQL Server数据

在上一篇博客<MySQL 之 5.6.22安装教程>中,我们介绍了MySQL的安装.今天我们主要讲解一下怎么在MySQL中导入外部SQL Server数据,简而言之就是我们怎么将SQL Server数据库中的数据迁移到MySQL数据库中. 为了实现我们想要的数据迁移,我们首先需要下载一个小工具SQLyog,然后安装到我们的电脑上,接下来我们就一步一步用这个小工具开始我们的数据迁移: 首先看看我们SQL Server数据库中的表结构和表中的数据 打开SQLyog,设置数据连接: 创建跟SQL S

SQL Server 2008空间数据应用系列九:使用空间工具(Spatial Tools)导入ESRI格式地图数据

转自:http://www.cnblogs.com/beniao/archive/2011/03/22/1989310.html 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC规范.KML规范)的

C#动态生成Word文档并填充数据

C#也能动态生成Word文档并填充数据 http://www.cnblogs.com/qyfan82/archive/2007/09/14/893293.html 引用http://blog.csdn.net/mengyao/archive/2007/09/13/1784079.aspx using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.

用命令从mysql中导出/导入表结构及数据

在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看:mysqldump最常用的:mysqldump -uroot -pmysql databasefoo table1 table2 > foo.sql这样就可以将数据库databasefoo的表table1,table2以sql形式导入foo.sql中,其中-uroot参数表示访问数据库的用户名是root,如果有密码还需要加上-p参数Eg: C:\Users\jack> mysqldump -uroo

将Excel导入SQL Server 只能导入数字,其他数据变为NULL怎么解决?

先新建一个TXT文件,把数据粘贴进去 再新建一个Excel文件,在菜单栏中选Data再选From Text 找到txt文件,点import 一定要选Text 点Finish,点OK. 接下来在往数据库中导入 打开SQL Server Management Studio 在需要导入数据的数据库名上点击鼠标右键选Task,选Import Date 点Next Data Soure选Microsoft Excel file path选你的Excel文件 点Next Authentication中选Us

导入CSV格式的数据

导入CSV格式的数据 (参见http://dev.mysql.com/doc/refman/5.6/en/load-data.html) 1.数据库表(st_pptn_r) CREATE TABLE st_pptn_r ( STCD varchar(8) DEFAULT NULL, TM datetime DEFAULT NULL, DRP decimal(5,1) DEFAULT NULL, INTV decimal(5,2) DEFAULT NULL, PDR decimal(5,2) DE