在VisualStudio2022的17.8Preview1版本中,我们更新了HTTP文件编辑器,使您能够外部化变量,从而使跨不同环境的WebAPI测试更容易。此更新还包括以安全方式处理secret的支持。要访问这些新功能,您需要安装17.8Preview1或更高版本。

在以前的版本中,如果你想在VisualStudio的HTTP文件中使用一个变量,这个变量必须直接在HTTP文件本身中定义。这使得使用相同的HTTP文件测试不同的环境变得更加困难,并且也使得使用需要secret的WebAPI变得困难。在这篇文章中,你将学习如何在外部文件中定义变量,然后在不同的HTTP文件中重用这些变量。您还将了解保护您的secret并在HTTP文件中以安全的方式重用这些secret的不同方法。在讨论secret支持之前,让我们先看一下环境文件支持。

环境文件概述

在VisualStudio2022中处理HTTP文件时,您可以定义多个HTTP请求,这些请求可以在IDE中执行。在以前的版本中,您可以定义可以在整个文件中使用的变量。在这个版本中,您可以外部化变量,这样您就可以定义要使用的不同的值和环境的集合。这也使您能够跨不同的HTTP文件使用相同的环境。

为了支持不同的环境,您可以添加一个文件名为的HTTP请求环境文件。您也可以在文件中存储特定于用户的值,但我们将在本文后面讨论这个问题。在我们接触之前,让我们看一个定义了几个请求的小HTTP文件。

@TemplatesApi_HostAddress=localhost:44320@searchTerm=api@templatePackId=@numToSkip=5@numToTake=2
GEThttps://{{TemplatesApi_HostAddress}}/api/search/{{searchTerm}}GEThttps://{{TemplatesApi_HostAddress}}/api/templatepack/{{numToSkip}}/{{numToTake}}

在此请求中,我们使用以下变量。

*TemplatesApi_HostAddress

*searchTerm

{"dev":{"TemplatesApi_HostAddress":"localhost:44320","searchTerm":"wpf"},"remote":{"TemplatesApi_HostAddress":"","searchTerm":"mads"}}

在文件中,我们定义了两个不同的环境,dev和remote。这两个环境都定义了我们上面讨论的两个变量。您可以在这些文件中定义任意数量的环境。在编辑完文件之后。您可能需要重新加载或编辑HTTP文件,以便发现环境文件。添加此文件后,您应该看到环境下拉菜单中填充了文件中定义的环境。如下图所示。


在上面的截图中,您可以看到处于展开状态的环境选择器。您可以看到两个环境,dev和remote。让我们从选择dev环境开始。您可以使用键盘快捷键F6访问HTTP编辑器中的环境选择器。现在我们已经在环境文件中定义了这两个变量,您应该从HTTP文件中删除它们。直接在HTTP文件中定义的变量总是优先于在环境文件中定义的变量。让我们将环境切换到remote,并在HTTP文件中发送第一个请求。下面是发送请求后ResponseView的Request选项卡。


在上图中,重要的部分被突出显示。您将注意到所选的环境是remote的。从Request选项卡上显示的完整URL中,我们可以看到TemplatesApi_HostAddress的的值是,searchTerm的值是wpf。对于HTTP文件中的第一个请求,我们现在可以轻松地从使用本地主机地址的开发环境切换到使用公共URL的远程环境。现在我们可以将其他变量移到环境文件中,这样我们就不会在该文件中硬编码任何值。更新后的HTTP文件和文件如下所示。

HTTP文件:

GEThttps://{{TemplatesApi_HostAddress}}/api/search/{{searchTerm}}
GEThttps://{{TemplatesApi_HostAddress}}/api/templatepack/{{numToSkip}}/{{numToTake}}

发送此请求后,我们可以在ResponseView的Request选项卡上检查传入的报头的值。结果如下图所示。


正如预期的那样,当发送请求时,X-API-KEY报头的值是预期的value-from-user-secrets。现在我们已经看到了如何在HTTP文件中使用来自usersecrets的值。现在让我们看看AzureKeyVault提供程序。

AzureKeyVault中的secret

AzureKeyVault是Azure中几个密钥管理解决方案之一,可用于secret管理以及安全管理其他工件。对于HTTP环境文件中当前支持的secret存储,KeyVault是跨不同用户共享secret的最佳选择。另外两个选项不容易共享。要使用AzureKeyVault中的值,我们需要定义一个新变量,并添加正确的元数据来访问该secret。下面你会看到一个更新版本的文件,它有一个新的变量,从AzureKeyVault获取它的值。

{"dev":{"searchTerm":"maui","templatesApiKey":{"provider":"AspnetUserSecrets","secretName":"config:templatesApiKeyDev"},"otherSecret":{"provider":"AzureKeyVault","keyVaultName":"sayedapi-keyvault-01","secretName":"SayedSecretValue1","resourceId":"/subscriptions/21e74a87-523d-4a15-87e9-8c5eb2df7716/resourceGroups/sayed-api-demo1"}}}

在上面的JSON文件中,我们定义了一个新变量otherSecret,它从AzureKeyVault中提取其值。在otherSecret上定义的属性总结如下。

Name

Description

provider

对于KeyVault总是使用AzureKeyVault。

keyVaultName

包含secret的KeyVault名称。

注意:在将来的更新中,此属性可能不会被删除。

secretName

要提取的secret的名称。

resourceId

要访问的特定KeyVault的AzureResourceId。

GEThttps://{{TemplatesApi_HostAddress}}/api/search/{{searchTerm}}X-CUSTOM-SECRET:{{otherSecret}}

当我们发送此请求时,自定义报头的值将显示在ResponseView的Request选项卡上。见下图。


我们可以看到secret值按预期传递进来。既然我们已经讨论了如何在HTTP请求和secrets中使用机密,那么让我们继续讨论在此版本中添加到HTTP编辑器中的其他一些特性。

新的HTTP文件语法支持

在我上一篇关于HTTP编辑器的博文中,我们提到在VSCodeRESTClientextension中仍然有很多HTTP文件支持的语法,而这些语法在VisualStudio2022中是不支持的。在这个版本中,我们增加了一些对额外语法的支持。下面列出了支持的新语法。

函数

描述

$randomInt

生成一个随机整数。

调用时的格式为{{$randomInt[minmax]}},其中min和max值是可选的。

注意:我们目前有一个bug,当指定最小值和最大值时总是返回最大值。这将在即将发布的版本中得到修复。

$datetime

生成一个日期时间字符串。支持的格式包括ISO8601、RFC1123或自定义格式。

调用时的格式为{{$datetimerfc1123|iso8601|“customformat”[offsetoption]}}。

$timestamp

生成UTC时间戳。默认行为从当前时间生成时间戳。使用选项,您可以生成偏移时间戳。

调用时的格式为{{$timestamp[offsetoption]}}。

$localdatetime

在您的本地时区生成一个日期时间字符串。

调用时的格式为{{$localdatetimerfc1123|iso8601|“customformat”[offsetoption]}}。

$processenv

返回提供的进程环境变量的值。

使用时的格式为{{$processEnvenvVarName}}。

$dotenv

返回.env文件中提供的变量的值。

使用时的格式为{{$dotenvvariableName}}。

这些是特殊的变量声明,将使用给定的参数生成一个值。我们将先看前四个,然后介绍剩下的两个。以下一些请求将使用免费的开源网站。这是一个第三方网站,不隶属于微软。这是一个很好的网站,可以帮助您API开发。看看主页,除了我在这里展示的,你还可以使用这个很棒的资源做更多事情。下面的请求显示了上表中前四个函数的一些示例。

GETX-1RandomInt:{{$randomInt}}X-2DateTime:{{$datetimeiso8601}}X-3DateTime:{{$datetimerfc1123}}X-4DateTime:{{$datetimerfc11231d}}X-5DateTime:{{$datetime"dd-MM-yyyy"1y}}X-6TimeStamp:{{$timestamp}}X-7TimeStamp:{{$timestamp1y}}X-8LocalDateTime:{{$localDatetimerfc1123}}X-9LocalDateTime:{{$localDatetimeiso8601}}X-10LocalDateTime:{{$localDatetimeiso86011y}}

对于上面的示例,我创建了一个环境变量API_SECRET,并将其值设置为“mySecretValueHere”。我还为“USERNAME”创建了一个名为ValToget的值。发送请求时,响应如下所示。


发送请求时,从USERNAME环境变量填充X-1Username的值,X-2ApiSecret也是如此。如果您使用$processEnv试图访问一个不存在的环境变量,您将在HTTP编辑器中得到一个警告。现在让我们继续讨论$dotenv。

当使用$processEnv时,您可以获得在机器/进程上定义的环境变量。在某些情况下,您可能需要获取.env文件中定义的变量的值。对于这些情况,您可以使用另一个特殊变量$dotenv。使用$dotenv的格式与$processEnv相同。我在项目文件夹中创建了一个名为.env的文件,其中包含以下内容。

USERNAME=sayedFromDotenvAPI_SECRET=secretFromDotenv

当使用$dotenv时,您应该在HTTP编辑器中看到所有定义的变量的补全。请看下面的图片。


在上面的图像中,您可以看到我们正在补完我在.env文件中定义的三个变量。下面是一个请求,我们可以用它来尝试$dotenv。

GETX-1Username:{{$dotenvUSERNAME}}X-2ApiSecret:{{$dotenvAPI_SECRET}}
#

当我们发送此请求时,结果将如下图所示。


如预期的那样,我们得到了X-1Username中的USERNAME值和X-2ApiSecret中的API_SECRET值。当使用.env文件时,请记住,这些文件通常不被签入,并且包含用户特定的值,甚至可能包含secret。默认情况下,这个文件可能不会从源代码管理中排除,所以如果使用这些文件时要小心,不要签入任何secret值。我们已经介绍了这个版本中的所有更新,因此我们将在参考资料部分之后结束本文。

参考资源

《DocsforusingHTTPfilesinVisualStudio2022》链接:

《RecentblogpostpublishedbySayeddiscussingWebAPIfeaturesinVisualStudio2022》链接:

《|MicrosoftLearn》链接:;tabs=windows

《AzureKeyVaultOverview–AzureKeyVault|MicrosoftLearn》链接:

小结

在这篇文章中,我们介绍了HTTP编辑器的许多更新,包括对多环境的支持,如何安全地使用secret以及我们支持的新语法。正如我在之前的博客文章中提到的,我们还有很多工作要做,以使HTTP文件的用户体验与VisualStudioCodeRESTClientextension不相上下。我们将继续投资,以改善用户体验。从我在上一篇博客文章中确定的项目来看,当前的优先级将是增加对从请求中获取值并将其传递给后续请求的支持。这将打开很多测试场景,并且在GitHub中找到的HTTP文件中大量使用。