65.9K
CodeProject 正在变化。 阅读更多。
Home

使用通用工具轻松测试 REST 方法

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.76/5 (10投票s)

2014年1月30日

CPOL

5分钟阅读

viewsIcon

25414

downloadIcon

1144

用于测试 REST 方法的工具的概述和用法

给科学怪人抹口红

注意:我写了这篇文章和工具的另一个版本 在这里,适用于不想在服务器路由属性中混合参数和路径信息的人。 

我为测试 Web API REST 调用而拼凑的客户端工具变得越来越臃肿/不切实际,或者坦率地说,比一袋屁股(或怪物般的组合,如 玛丽·雪莱的亚当)还要丑 9 倍,你可以在这里看到。

所以我决定清理一下,创建一个更通用的 Windows 窗体工具。我的目标是避免每次想测试新控制器时都要添加一组按钮。我现在需要做的就是将控制器方法的“装饰”(或路由属性)添加到组合框或文本文件中。然后,当我运行该工具时,我会加载文本文件或从组合框中选择要测试的 URI。该工具将根据所选的 URI 确定需要添加哪些参数,并使(最多四个)文本框可见,我可以在其中输入要传递的参数值。然后该工具将构建要发送到 Web API 服务器的 URI。

我将在此工具的代码添加到本文中,但不会在这里重点介绍,因为我意识到其中有些代码很笨拙,而且很多人可以优雅化它并使其更“高效”——换句话说,所使用的代码不一定是在所有情况下实现目标的最佳方式——但它对我来说效果很好,所以我分享它;我还会添加*.exe*作为下载。本文的重点是引导您了解其用法。

说起不够优雅的代码,在将参数数量从 4 个增加到 10 个之后,我用以下代码替换了粗暴/冗长的 VisiblizeCandidateArgs() 代码。

        private void VisiblizeCandidateArgs(bool visiblize)
        {
            const int CANDIDATE_COUNT = 10;
            for (int i = 1; i <= CANDIDATE_COUNT; i++)
            {
                Control lbl = GetControlByName(string.Format("labelArg{0}", i));
                lbl.Visible = visiblize;
            }
            for (int i = 1; i <= CANDIDATE_COUNT; i++)
            {
                Control txtbx = GetControlByName(string.Format("textBoxArg{0}", i));
                txtbx.Visible = visiblize;
                if (!visiblize)
                {
                    txtbx.Text = string.Empty;
                }
            }
        }

这个疯狂的七步法

此时此刻,我将引导您使用该工具。实际上,我在窗体控件上标记了数字,以指示您应该通过(或快速浏览)该工具的步骤。

首先,运行它,您将看到一些非常引人注目的东西(YMMV)。

令人震惊!!!您在此看到我的应用程序的基本 URI 出现在第 0 步(输入基本 URI)!多么自恋!嗯,其实也不是,因为它只是(供您)作为“活生生”的例子(“它活了!”)——您可以(也应该)更改 URI 以适合您将要测试的 REST 服务。

按下“1) 从文件加载路由属性”按钮进行此操作(首先,您必须有一个这样的文件,或者,如果您已下载代码,则可以将您想要的 URI 添加到组合框的 Items 属性中)。

一句(或两句)充分的话:有关使用显式属性路由装饰控制器方法的背景信息,请参阅 本文

您加载的文本文件可能包含类似以下内容

  • [Route("api/SQLServerPOC/Count")]
  • [Route("api/SQLServerPOC/GetAll")]
  • [Route("api/SQLServerPOC/{ID:int}")]
  • [Route("api/SQLServerPOC/GetByFullName/{FName}/{MName}/{LName}")]
  • [Route("api/SQLServerPOC/GetByLastName/{LName}")]
  • [Route("api/SQLServerPOC/GetByStateOrProvince/{StateOrProvince}")]
  • [Route("api/SQLServerPOC/GetByZip/{PostalCode}")]
  • [Route("api/SQLServerPOC/GetByCountry/{Country}")]

现在您已经填充了组合框,您可以转到第 2 步 - 选择一个项目/ URI。

“3) 发现属性参数”按钮会检查 URI 并确定 URI 中包含的任何“区分器”(例如“GetAll”或“GetByLName”或任何其他)以及是否有参数以及有多少。如果有,它会使适当数量的标签/文本框对可见(最多四个),以便您可以输入一个适当的值作为参数在文本框中传递(标签指示参数的名称及其数据类型)。这是您在选择一个包含三个参数的 URI 并输入一些值到文本框后可能看到的内容。

如果您然后点击“5) (重新)构建 URI”按钮,它将执行此操作,将控制器名称、“区分器”(如果有)(在本例中为 GetByFullName)以及任何参数值附加到基本 URI。不相信我?试试看:(

唯一剩下要做的就是按下“6) 测试 URI”按钮。但由于我想展示更多数据,我将更改 URI 以按州选择,然后进行操作。结果是

绝望单身者的圣歌

已知问题:如果只返回一个 json“记录”,GetRESTData() 方法(在按下“测试 URI”按钮时调用)会崩溃。我猜是因为它不认为一个小的元素是数组,而是返回一个 JArray。所以这是一个留给读者的练习:想办法解决它。

我确实找到了一个巧妙但笨拙的方法来绕过 GetRESTData() 在只找到一个 json 数组元素时崩溃的问题。我更改了这段代码

        private JArray GetRESTData(string uri)
        {
            var webRequest = (HttpWebRequest)WebRequest.Create(uri);
            var webResponse = (HttpWebResponse)webRequest.GetResponse();
            var reader = new StreamReader(webResponse.GetResponseStream());
            string s = reader.ReadToEnd();
            return JsonConvert.DeserializeObject<jarray>(s);
        }

...到这里

        private JArray GetRESTData(string uri)
        {
            try
            {
                var webRequest = (HttpWebRequest)WebRequest.Create(uri);
                var webResponse = (HttpWebResponse)webRequest.GetResponse();
                var reader = new StreamReader(webResponse.GetResponseStream());
                string s = reader.ReadToEnd();
                return JsonConvert.DeserializeObject<jarray>(s);
            }
            catch // This method crashes if only one json "record" is found
            {
                try
                {
                    MessageBox.Show(GetScalarVal(uri));
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
            return null;
        }

        private string GetScalarVal(string uri)
        {
            var client = new WebClient();
            return client.DownloadString(uri);
        }

更新:我又添加了一个可以下载的文件;我测试工具的最新版本(截至 2014 年 2 月 7 日)作为项目模板。该文件名为“Web_API_GET_REST_Test.zip”。随意改编、采纳、调整,但不要折叠、纺织、残害或以其他方式粗暴地咀嚼它。

TANSTaaFL

如果您喜欢这篇文章/工具,请善良并倒带……宇宙中所有磁带——而且还要在下午茶时间之前!替代服务:踮着脚尖穿过郁金香。

© . All rights reserved.