XSLT存档  

不及格的程序员-八神

 查看分类:  ASP.NET XML/XSLT JavaScripT   我的MSN空间Blog

Exploring the New Visual Studio Feature: .http Files

Introduction:

Visual Studio, the popular integrated development environment (IDE) by Microsoft, continually evolves to enhance developers' productivity and streamline their workflows. In the latest release, a new feature has been introduced: .http files. These files provide a convenient way to interact with HTTP APIs directly within Visual Studio. In this blog post, we will delve into the details of .http files, explore code examples in C#, discuss the system dynamic variables available, and highlight their similarity to the Visual Studio Code extension, "REST Client."


Understanding .http Files:

.HTTP files in Visual Studio act as a lightweight HTTP client, allowing developers to write and execute HTTP requests directly in the IDE. These files are inspired by the Visual Studio Code extension called "REST Client" and provide a similar experience within Visual Studio itself. They are designed to simplify the process of testing and debugging HTTP APIs.

Creating an .http File:

To create an .http file in Visual Studio, follow these steps:

  • Right-click on your project or desired location in the Solution Explorer.
  • Choose "Add" and then "New Item."
  • Select "Text File" from the available templates and name it with the .http extension.

Writing HTTP Requests in C#:

Let's explore some code examples to demonstrate how to use .http files effectively in Visual Studio using C#. Assume we have an API endpoint at "https://api.example.com/users" that returns a list of users in JSON format.

Sending a GET Request:

GET https://api.example.com/users

HTTP/1.1
Host: api.example.com
 

Sending a POST Request:

POST https://api.example.com/users

Content-Type: application/json

{
  "name": "John Doe",
  "email": "john.doe@example.com"
}
 

System Dynamic Variables in .http Files:

Visual Studio's .http files provide a set of system dynamic variables that you can utilize to enhance your HTTP requests. These variables simplify the process of including dynamic values in your requests, such as environment-specific URLs or authentication tokens.

Here are the system dynamic variables available in .http files:

{{guid}}: Generates a new GUID for each request.
{{randomInt}}: Generates a random integer for each request.
{{timestamp}}: Represents the current timestamp.
{{date}}: Represents the current date.
{{time}}: Represents the current time.
{{utcDate}}: Represents the current UTC date.
{{utcTime}}: Represents the current UTC time.
{{month}}: Represents the current month.
{{year}}: Represents the current year.
{{host}}: Represents the current host URL.

Example using system dynamic variables:

POST https://api.example.com/users

Content-Type: application/json

{
  "id": "{{guid}}",
  "name": "John Doe",
  "email": "john.doe@example.com"
}

###

GET https://api.example.com/logs?timestamp={{timestamp}}

###
 

Conclusion:

With the introduction of .http files in Visual Studio, developers now have a convenient way to interact with HTTP APIs directly within their IDE. These files provide a familiar and intuitive syntax, making it easier to test and debug APIs without leaving the development environment. By utilizing system dynamic variables, developers can enhance their HTTP requests and streamline their workflows further. .http files in Visual Studio resemble the functionality of the "REST Client" extension in Visual Studio Code, providing a seamless experience across platforms.

Start leveraging this powerful feature today and experience the productivity boost it offers!

Happy coding with Visual Studio and .http files!

(Note: The code examples provided in this blog are for demonstration purposes only. Actual implementation may vary depending on the specific HTTP API and requirements.)

 


【译】HTTP 文件更新了请求变量

发布于 2025-04-01 09:31:27
21400
代码可运行
举报
文章被收录于专栏:DotNet NB && CloudNative

许多用户都要求在 Visual Studio 的 HTTP 文件中添加对请求变量的支持。使用请求变量,您可以发送 HTTP 请求,然后在从 HTTP 文件发送的任何后续请求中使用响应或请求中的数据。我们还添加了对共享环境 $shared 的支持,它使您能够在不同的环境中共享变量。在这篇文章中,我们将概述对请求变量等新添加的支持。本文中列出的所有功能都包含在 Visual Studio 2022 17.12+ 中。

请求变量

在使用 API 时,通常会从终结点获取一个值,然后在后续请求中使用该值。这可以通过使用请求变量来实现。我们有请求变量的文档,但我们也会在这里讨论所有内容。使用请求变量的一个更常见的场景是,当您调用终结点对 API 进行身份验证并获得可用于未来请求的令牌时。下面的示例请求是 David Fowler 的 TodoApi 示例。该 API 有一个终结点,您可以通过提供用户名和密码来创建一个新用户。这是我们正在发出请求的终结点。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
 
@username = bloguser
# login and save the response as "login"
# @name login
POST {{TodoApi_HostAddress}}/users/token
Content-Type: application/json
{
  "username": "{{username}}",
  "password": "{{password}}"
}
###

在这种情况下,用户名是在 HTTP 文件中定义的,但密码是使用 HTTP Environments 安全地存储的。下面的请求是发送给 /users/token 终结点的,我们将用户名和密码作为 HTTP 请求主体的一部分传入。使其成为请求变量(有时也称为命名请求),特殊之处在于注释上方的那一行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
 
# @name login

在 Visual Studio 中发送此请求后,您可以从响应或请求中获取值。在下面的代码片段中,您可以看到我们如何使用登录中的请求变量来访问在提交响应时作为响应的一部分返回的令牌。登录的响应包含一个 token。现在我们已经登录了,我们可以用下面的请求创建一个 TODO 项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
 
# Create a TODO item
# @name todo1
POST {{TodoApi_HostAddress}}/todos
Authorization: Bearer {{login.response.body.$.token}}
Content-Type: application/json

{
  "title": "Write blog post"
}
###

在此请求中,我们提取 token 值并使用它来指定 Authorization 头的值。语法为 {{login.response.body.$.token}}。让我们仔细看看语法。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
 
{{login.response.body.$.token}}

下面的表格总结了使用来自请求变量的值的语法:

元素

描述

requestVarName

被引用的请求变量。

response|request

是否从响应或请求中提取值。

body|headers

是否从请求或响应的报头或正文中提取值

*|JSONPath|XPath|Header

计算表达式,用于结果提取对于返回 JSON 主体的请求,使用 JSONPath 表达式。对于返回 XML 主体的请求,使用 XPath。* 将返回整个结果。当从 header 中提取时不能使用*。

对于上面的示例请求,我们从响应中提取令牌,并将其作为请求的标头传递给 /todos 终结点。发送此请求后,返回的结果如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
 
{
  "id": 36,
  "title": "Write blog post",
  "isComplete": false
}

现在我们已经创建了一个 TODO 项目,我们可以用下面的请求更新该项目。如果您注意到上面的请求声明了一个名为 todo1 的请求变量,那么我们可以使用它来引用响应或请求中的值。让我们更新标题,在当前标题的末尾添加“today”。下面的请求将更新 TODO 项。我们将使用 PUT,因为这是对现有项的更新。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
 
PUT {{TodoApi_HostAddress}}/todos/{{todo1.response.body.$.id}}
Authorization: Bearer {{login.response.body.$.token}}
Content-Type: application/json

{
  "id": {{todo1.response.body.$.id}},
  "title": "{{todo1.response.body.$.title}} today",
  "isComplete": {{todo1.response.body.$.isComplete}}
}
###

在这个请求中,我们使用来自原始 todo1 请求的数据填充 PUT 请求的主体。注意,title 属性将“today”附加到现有标题的末尾。发送此请求后,结果为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
 
{
  "id": 36,
  "title": "Write blog post today",
  "isComplete": false
}

在这里,您可以看到博客文章的标题已成功更新。在这些示例中,我展示了如何处理“扁平”的 JSON 结果,但是您可以使用任何 JSONPath 表达式从响应或请求体中提取数据。如果终结点返回 XML,请使用 XPath 表达式而不是 JSONPath。让我们继续讨论对 $shared 的支持。

$shared

在使用 HTTP 环境时,您可以为 HTTP 请求定义多个不同的环境。例如,您可以创建一个引用本地运行的 API 的开发环境,当您想要向远程测试环境发送请求时创建一个测试环境。在这些情况下,您可能希望声明一个对所有环境都可用的变量。这正是新的 sharedHTTPhttpclient.env.jsonhttpclient.env.json.user为shared 的环境,那么这些变量将在任何环境中可用。如果在 sharedHTTP个shared 环境和两个标准环境。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
 
{
  "$shared": {
    "message": "Default msg from Shared",
    "username": "httpfile-user",
    "hosturl": "http://example.com/api/sample"
  },
  "dev": {
    "hosturl": "http://localhost:5000/api/sample"
  },
  "prod": {
    "message": "Message from prod environment"
  }
}

这是一个非常基本的 HTTP 环境文件,除了 $shared 之外,我们还定义了 dev 和 prod 环境。在 dev 环境中,hosturl 的值已被定制为指向localhost,而 prod 环境已自定义 message 的值。为了说明这是如何工作的,我们将使用第三方开源网站 httpbin.org。对于 API 开发人员来说,httpbin.org 是一个很好的工具。我们将创建一个 HTTP 文件,向 httpbin.org 发出请求,并让它返回所提供的值。我们将使用 /headers 终结点,这样 httpbin 就会回显我们发送给它的报头。以下是我们将发送的请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
 
GET https://httpbin.org/headers
X-Message: {{message}}
X-User: {{username}}
X-Hosturl: {{hosturl}}

###

此请求将使用发送到 httpbin.org 的请求中 HTTP 环境中定义的变量。提醒一下,您可以在 HTTP 文件编辑器右上方的下拉菜单中选择环境。我将环境设置为 dev,来自 httpbin.org 的结果如下所示。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
 
{
  "headers": {
    "X-Hosturl": "http://localhost:5000/api/sample",
    "X-Message": "Default msg from Shared",
    "X-User": "httpfile-user"
  }
}

在响应中,我删除了一些无关的标题。我们可以看到,这些值正在按预期填充。hosturl 的值是在 dev 环境中指定的 localhost,其他值来自 $shared。当我们将环境切换到 prod 并发送相同的请求时,响应如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
 
{
  "headers": {
    "X-Hosturl": "http://example.com/api/sample",
    "X-Message": "Message from prod environment",
    "X-User": "httpfile-user"
  }
}

hosturl 和 message 的值都已更改。hosturl 和 username 的值来自 sharedmessageprod则shared 中的值将可用。现在我们已经介绍了对

小结

在这篇文章中,我们介绍了 HTTP 文件的两个新特性,请求变量和 HTTP 环境中的 shared使API使用shared,您现在可以跨环境共享变量,从而使您更容易使用 HTTP 环境。如果您不熟悉 HTTP 文件,请查看文档以获取更多信息。

这次更新灵感来自于像您这样的用户的反馈。您可以通过开发者社区与我们分享反馈:通过报告错误或问题,并分享您对新功能或改进现有功能的建议。

原文连接:https://devblogs.microsoft.com/visualstudio/http-file-updates-for-request-variables-and-more/


Visual Studio - API调试与测试工具之HTTP文件

 
2024-12-25166阅读6分钟
 

后端开发,我们对于Api接口调试测试大致有以下方法:单元测试、Swagger、Postman。

但是每种方式也都有其局限性,几年前使用Visual Studio Code开发过一段时间,接触了REST Client扩展工具印象特别深刻,简单、轻量、可编码、与开发工具无缝衔接,整体效率相当高。

1.png

再此之后我一直在关注Visual Studio是否有类似的工具,直到最近发现Visual Studio 2022版本17.8开始支持类似REST Client扩展工具相关功能了,虽然功能还不够完善但是也基本够用了。

今天和大家分享怎么通过.http文件便捷调试测试Api接口。

2.png

01、.http文件创建方式

.http文件有两种创建方式:其一为通过添加文件,其二为通过终结点资源管理器生成。

1、添加文件方式

就像平时添加类文件一样,通过选择类库右击选择添加,选择新建项,然后找到HTTP文件选项,可以修改名称最后点击添加按钮即可。

3.png

2、终结点资源管理器生成方式

首先选择视图菜单,找到其他窗口,然后找到终结点资源管理器并点击,即可打开。

4.png

打开后效果如下:

5.png

然后我们可以任意选择一个接口,右击按钮并点击生成请求,即可自动创建.http文件并自动生成当前接口的默认请求示例,如下图:

6.png

02、.http 文件语法

1、请求

HTTP请求格式为[HTTPMethod URL HTTPVersion]。

HTTPMethod: 表示HTTP方法包括增删改查四大常见方法:GET、POST、PUT、DELETE,以及一些其他HTTP方法OPTIONS、HEAD、PATCH、TRACE、CONNECT;

URL: 表示发送请求的URL,即请求目标URL,像正常方法URL一样可以包含查询字符串参数;

HTTPVersion: 此项为可选项,是指应用的HTTP版本,即 HTTP/1.1、HTTP/2 或 HTTP/3。

当然一个.http文件中可以包含多个请求,可以通过###作为分隔符把多个请求分开

 
POST https://localhost:5137/orders

###

GET https://localhost:5137/orders?id=98006

###

DELETE https://localhost:5137/orders HTTP/3

###

2、请求头、请求体

在实际请求中,我们不单单要指定请求方法,请求URL,还需要指定请求头以及请求体。

常见的请求有请求内容类型、响应内容类型、编码方式、缓存控制、内容类型、身份验证、跨域请求等等。

请求头格式为[HeaderName: Value],一个请求头类型占一行,可以有多个请求头,并且每个请求头之间不能有空白行,请求头和请求行之间也不能有空白行。

 
GET https://localhost:5137/orders
Accept: application/json, text/html

###

GET https://localhost:5137/orders
Cache-Control: max-age=604800
Age: 100

###

请求体是指HTTP请求中携带的实际数据,在请求行或者请求头后空白行之后添加,示例如下:

 
GET https://localhost:5137/orders
Content-Type: application/json

{
  "id": "897",
  "date": "2024-12-24",
  "price": 5,
  "priceF": 2,
  "name": "小红",
  "status": "Pending"
}

###

3、注释、变量

注释是以#或//开头的行,可以加强代码的可读性。

变量是以@开头的行,其语法格式为[@VariableName=Value],定义好变量后可以通过双大括号{{ VariableName }}来使用变量,同时也可以使用已经定义好的变量来定义新的变量。

 
@hostname=localhost
@port=5137
@host={{hostname}}:{{port}}
GET https://{{host}}/orders?id=98006

4、环境文件

在实际开发过程中,针对开发环境、测试环境,甚至生产环境,我们需要对同一个变量提供不同的值,比如不同环境首先域名就不同,其次针对不同环境的测试数据也不同。

这时候我们就可以使用环境文件,我们可以在.http文件所在的目录中或者其父目录中创建名为http-client.env.json的文件。如下代码,我们创建了开发环境和生产环境两个不同的域名。

 
{
  "dev": {
    "HostAddress": "http://localhost:5137"
  },
  "pro": {
    "HostAddress": "http://localhost:8888"
  }
}

此时我们可以在.http文件窗口右上角进行切换不同环境。

7.png

下面我们选择pro环境进行测试一下,结果如下。

8.png

可以看到此时域名读取了正式环境域名。

此时我们是可以把环境文件提交到代码库中和团队共享测试变量,那如果有些敏感的数据我们并不想提交到代码库和别人分享要怎么办呢?

我们可以在环境文件同级目录中创建http-client.env.json.user文件,它和环境文件编写规则完全一样,只是优先级比环境文件优先级更高。当然我们需要在代码管理的忽略文件.gitignore排查.user后缀的文件,防止其被意外提交至代码块。

03、身份验证

可以说我们的每个后端接口都有相关认证授权,可能使用Jwt,OAuth令牌,API密钥,用户密码等方式,这就导致我们平时测试的时候,需要先登录,然后拿到相关的认证凭证,再去调相关的接口。

这意味这我们面临一种情况,调用B接口需要依赖A接口的返回结果。首先答案很明确可以做到,要怎么做呢?

我们可以在A接口请求上面使用以下语法[# @name VariableName],来定义承载接口返回结果变量。

下面我们实现一个登录接口,直接返回Jwt凭证即token字符串,然后使用这个token请求查询订单接口。

 
//登录
# @name login
POST {{Web_HostAddress}}/login
Accept: application/json

###

//查询订单
@id=897
GET {{Web_HostAddress}}/orders?id={{id}}
Authorization: Bearer {{login.response.body.$.[0]}}

###

需要注意的是,因为我们登录即可是直接返回的字符串,所以这里使用的是login.response.body.<span class="katex"><span class="katex-mathml">.[0],如果我们返回的是对象并且token是赋值在token字段上的,则应该使用login.response.body.<span class="katex-html"><span class="base"><span class="strut"><span class="mord">.<span class="mopen">[<span class="mord">0<span class="mclose">]<span class="mord cjk_fallback">,如果我们返回的是对象并且<span class="mord mathnormal">t<span class="mord mathnormal">o<span class="mord mathnormal">k<span class="mord mathnormal">e<span class="mord mathnormal">n<span class="mord cjk_fallback">是赋值在<span class="mord mathnormal">t<span class="mord mathnormal">o<span class="mord mathnormal">k<span class="mord mathnormal">e<span class="mord mathnormal">n<span class="mord cjk_fallback">字段上的,则应该使用<span class="mord mathnormal">l<span class="mord mathnormal">o<span class="mord mathnormal">g<span class="mord mathnormal">in<span class="mord">.<span class="mord mathnormal">res<span class="mord mathnormal">p<span class="mord mathnormal">o<span class="mord mathnormal">n<span class="mord mathnormal">se<span class="mord">.<span class="mord mathnormal">b<span class="mord mathnormal">o<span class="mord mathnormal">d<span class="mord mathnormal">y<span class="mord">..token。

9.png

并且当我们点击查询订单接口请求上面的调试时,即使我们程序没有运行起来,它也会自动运行,并且也会自动去执行登录接口,拿到它所需的token,然后运行自身。

而发送请求按钮就必须要求程序运行起来以后才能生效。

到这里.http文件使用就介绍完了,可以说基本够用了,当然还有很多地方需要完善的,比如说上传文件,终结点资源管理器不能直接自动生成请求体结构等等,相信要不了多久这些功能就会完善起来的,安心等待即可。


使用 Visual Studio 2022 中的 .http 文件

Visual Studio 2022.http 文件编辑器提供了一种便捷的方式来测试 ASP.NET Core项目,尤其是 API 应用。 编辑器提供一个 UI,用于:

  • 创建和更新 .http 文件。
  • 发送 .http 文件中指定的 HTTP 请求。
  • 显示响应。

本文包含以下文档:

.http 文件格式和编辑器受 Visual Studio Code REST 客户端扩展的启发。 Visual Studio 2022 .http 编辑器将 .rest 识别为相同文件格式的替代文件扩展名。

先决条件

.http 文件语法

以下部分介绍 .http 文件语法。

请求

HTTP 请求的格式为 HTTPMethod URL HTTPVersion,全部在一行上,其中:

  • HTTPMethod 是要使用的 HTTP 方法,例如:
  • URL 是向其发送请求的 URL。 此 URL 可以包括查询字符串参数。 此 URL 不必指向本地 Web 项目。 它可以指向 Visual Studio 可以访问的任何 URL。
  • HTTPVersion 是可选的,指定应使用的 HTTP 版本,即 HTTP/1.1HTTP/2 或 HTTP/3

通过使用行 ### 作为分隔符,文件可以包含多个请求。 以下示例在一个文件中显示了三个请求,说明了此语法:

HTTP
GET https://localhost:7220/weatherforecast

###

GET https://localhost:7220/weatherforecast?date=2023-05-11&location=98006

###

GET https://localhost:7220/weatherforecast HTTP/3

###

请求标头

若要添加一个或多个标头,请将每个标头立即添加到请求行后其自己的行中。 不要在请求行与第一个标头之间或后续标头行之间包含任何空白行。 格式为 HeaderName: Value,如以下示例所示:

HTTP
GET https://localhost:7220/weatherforecast
Date: Wed, 27 Apr 2023 07:28:00 GMT

###

GET https://localhost:7220/weatherforecast
Cache-Control: max-age=604800
Age: 100

###

 重要

调用使用标头进行身份验证的 API 时,请勿将任何机密提交到源代码存储库。 请参阅本文后面的支持存储机密的方法,例如 ASP.NET Core 用户机密Azure Key Vault 和 DPAPI 加密

请求正文

在空白行后面添加请求正文,如以下示例所示:

HTTP
POST https://localhost:7220/weatherforecast
Content-Type: application/json
Accept-Language: en-US,en;q=0.5

{
    "date": "2023-05-10",
    "temperatureC": 30,
    "summary": "Warm"
}

###

注释

以 # 或 // 开头的行是注释。 当 Visual Studio 发送 HTTP 请求时,将忽略这些行。

变量

以 @ 开头的行使用语法 @VariableName=Value 定义变量。

可以在稍后在文件中定义的请求中引用变量。 通过用双大括号括起名称 {{ 和 }} 来引用它们。 以下示例演示在请求中定义和使用的两个变量:

HTTP
@hostname=localhost
@port=44320
GET https://{{hostname}}:{{port}}/weatherforecast

可以使用文件前面定义的其他变量的值来定义变量。 以下示例在请求中使用一个变量,而不是前面示例中所示的两个变量:

HTTP
@hostname=localhost
@port=44320
@host={{hostname}}:{{port}}
GET https://{{host}}/api/search/tool

环境文件

若要在不同的环境中为变量提供不同的值,请创建名为 http-client.env.json 的文件。 在 .http 文件所在的同一目录中或其中一个父目录中找到该文件。 下面是环境文件的示例:

JSON
{
  "dev": {
    "HostAddress": "https://localhost:44320"
  },
  "remote": {
    "HostAddress": "https://contoso.com"
  }
}

环境文件是一个 JSON 文件,其中包含一个或多个命名环境,例如前面示例中的“dev”和“remote”。 每个命名环境都包含一个或多个变量,例如前面的示例中的 HostAddress。 从环境文件中引用变量的方式与其他变量相同,如以下示例所示:

HTTP
GET {{HostAddress}}/api/search/tool

发送请求时用于变量的值由 .http 文件编辑器右上角的环境选择器下拉列表确定。 以下屏幕截图显示了选择器:

包含突出显示的环境选择器的 .http 文件编辑器。选中了“开发”环境。

环境文件不必位于项目文件夹中。 Visual Studio 在 .http 文件所在的文件夹中查找环境文件。 如果它不在该文件夹中,Visual Studio 会浏览父目录来查找它。 找到名为 http-client.env.json 的文件后,搜索将结束。 将使用最接近 .http 文件的文件。

创建或编辑 .http 文件后,可能需要关闭并重新打开项目,以查看环境选择器中反映的更改。 按 F6 选择环境选择器。

Visual Studio 在以下情况下显示警告:

  • .http 文件引用了未在 .http 文件或环境文件中定义的变量。
  • 环境文件包含 .http 文件中未引用的变量。

在环境文件中定义的变量可以与 .http 文件中定义的变量相同,也可以不同。 如果在 .http 文件和环境文件中都定义了变量,则 .http 文件中的值将替代环境文件中的值。

共享变量

$shared 是针对在多个环境中相同的值的特殊环境名称。 例如,请考虑以下环境文件 (http-client.env.json):

JSON
{
    "$shared": {
        "HostAddress": "https://localhost:7293"
    },
    "dev1": {
        "username": "dev1user"
    },
    "dev2": {
        "username": "dev2user"
    },
    "staging": {
        "username": "staginguser",
        "HostAddress": "https://staging.contoso.com"
    }
}

在前面的示例中,$shared 环境定义值为 localhost:7293 的 HostAddress 变量。 值为 HostAddress 的 localhost:7293 变量将在未定义 HostAddress 的环境中作为默认值。 定义 dev1 或 dev2 环境时,HostAddress 的值来自 $shared 环境,因为 dev1 和 dev2 不定义 HostAddress 变量。 定义 staging 环境时,HostAddress 的值设置为 https://staging.contoso.com,并替代 $shared 默认值。

请求变量

可以将值从一个 HTTP 请求传递到同一 .http 文件中的另一个 HTTP 请求。

  1. 创建位于请求 URL 之前的单行注释,以命名以下请求。 例如,以下行显示了命名请求 login的替代方法:

    HTTP
    # @name login
    https://contoso.com/api/login HTTP/1.1   
    
    HTTP
    // @name login
    https://contoso.com/api/login HTTP/1.1
    
  2. 在同一 HTTP 文件中的后续请求中,使用请求名称来引用请求。

  3. 使用以下语法提取所需响应的特定部分。

    HTTP
    {{<request name>.(response|request).(body|headers).(*|JSONPath|XPath|<header name>)}}.
    

    使用此语法可以从请求本身或从响应中提取值(request|response)。 对于请求或响应,可以从正文或标头(body|headers)中提取值。

    选择 body 时,语法 *|JSONPath|XPath 部分适用:

    • * 提取整个响应正文。

      示例: {{login.response.body.*}}

    • 对于 JSON 响应,请使用 JSONPath 提取某个特定属性。

      示例: {{login.response.body.$.token}}

    • 对于 XML 响应,请使用 XPath 提取特定属性或特性。

      示例: {{login.response.body./token}}

    选择 headers 后,标头名称将提取整个标头。 标头名称不区分大小写。

    示例: {{login.response.headers.Location}}

如果要引用命名请求的响应,则需要手动触发命名请求以先检索其响应。 从响应中提取值时,如果请求已多次发送,则会收到最新的响应。

请求变量用法示例

例如,假设 HTTP 文件有一个对调用方进行身份验证的请求,并将它命名为 login。 响应正文是一个 JSON 文档,其中包含名为 token的属性中的持有者令牌。 在后续请求中,你需要在 Authorization 标头中传入此持有者令牌。 以下示例演示如下操作:

HTTP
# @name login

POST {{TodoApi_HostAddress}}/users/token 
Content-Type: application/json 

{ 
  "username": "{{myusername}}", 
} 

### 

GET {{TodoApi_HostAddress}}/todos 
Authorization: Bearer {{login.response.body.$.token}}

### 

语法 {{login.response.body.$.token}} 表示持有者令牌:

  • login:请求名称。
  • response:指 HTTP 响应对象。
  • body:指 HTTP 响应的正文。
  • $:表示响应正文中 JSON 文档的根元素。
  • token:指 JSON 文档中的特定属性。

如果不使用请求变量,则需要从登录响应中手动提取令牌,并将其包含在后续请求的标头中。 通过请求变量,可以自动执行此过程。

特定于用户的环境文件

特定于用户的值是开发人员想要测试但不想与团队共享的任何值。 默认情况下,http-client.env.json 文件提交至源代码管理,因此,切勿 向此文件添加用户特定的值。 相反,在名为 http-client.env.json.user 的文件中添加特定于用户的值。 http-client.env.json.user 文件位于与 http-client.env.json 文件相同的文件夹中。 使用 Visual Studio 源代码控制功能时,默认情况下会从源代码控制中排除以 .user 结尾的文件。

加载 http-client.env.json 文件时,Visual Studio 会查找同级 http-client.env.json.user 文件。 如果在 http-client.env.json 文件和 http-client.env.json.user 文件中的环境中都定义了变量,则 http-client.env.json.user 文件中的值优先级更高。

以下示例方案演示了特定于用户的环境文件工作原理。 假设 .http 文件包含以下内容:

HTTP
GET {{HostAddress}}/{{Path}}
Accept: application/json

假设 http-client.env.json 文件包含以下内容:

JSON
{
  "dev": {
    "HostAddress": "https://localhost:7128",
    "Path": "/weatherforecast"
  },
  "remote": {
    "HostAddress": "https://contoso.com",
    "Path": "/weatherforecast"
  }
}

假设有一个特定于用户的环境文件,其中包含以下内容:

JSON
{
  "dev": {
    "Path": "/swagger/index.html"
  }
}

当用户选择“开发”环境时,将向 https://localhost:7128/swagger/index.html 发送请求,因为 Path 文件中的 http-client.env.json.user 值会替代 http-client.env.json 文件中的值。

使用相同的环境文件,假设变量已在 .http 文件中定义:

HTTP
@HostAddress=https://contoso.com
@Path=/weatherforecast

GET {{HostAddress}}/{{Path}}
Accept: application/json

在此场景中,“dev”环境请求将发送到 https://contoso.com/weatherforecast,因为 .http 文件中的变量定义会替代环境文件定义。

ASP.NET Core 用户机密

若要从用户机密获取值,请使用与 ASP.NET Core 项目位于相同文件夹的环境文件。 在环境文件中,定义具有 provider 和 secretName 属性的变量。 将 provider 值设置为 AspnetUserSecrets,并将 secretName 设置为所需用户机密的名称。 例如,以下环境文件定义一个名为 ApiKeyDev 的变量,它的值获取自 config:ApiKeyDev 用户机密:

JSON
{
  "dev": {
    "ApiKeyDev": {
      "provider": "AspnetUserSecrets",
      "secretName": "config:ApiKeyDev"
    }
  }
}

若要在 .http 文件中使用此变量,请像标准变量一样引用它。 例如:

HTTP
GET {{HostAddress}}{{Path}}
X-API-KEY: {{ApiKeyDev}}

发送请求时,ApiKeyDev 机密的值位于 X-API-KEY 标头中。

键入 http 文件时,编辑器会显示变量名称的完成列表,但不会显示其值。

Azure Key Vault

Azure Key Vault 是 Azure 中可用于管理机密的多个密钥管理解决方案之一。 在当前支持 .http 文件的三种机密存储中,Key Vault 是跨不同用户共享机密的最佳选择。 其他两个选项(ASP.NET User Secrets 和 DPAPI 加密)不容易共享。

若要使用 Azure Key Vault 中的值,必须使用有权访问所需 Key Vault 的帐户登录到 Visual Studio。 使用元数据在环境文件中定义变量以访问机密。 在以下示例中,变量名为 AKVSecret

JSON
{
  "dev": {
    "AKVSecret": {
      "provider": "AzureKeyVault",
      "secretName": "SecretInKeyVault",
      "resourceId": "/subscriptions/3a914c59-8175a9e0e540/resourceGroups/my-key-vault-rg/providers/Microsoft.KeyVault/vaults/my-key-vault-01182024"
    }
  }
}

AKVSecret 变量从 Azure Key Vault 拉取其值。 AKVSecret 上定义了以下属性:

 
名称描述
提供程序 对于密钥保管库,请始终使用 AzureKeyVault
secretName 要提取的机密的名称。
resourceId 要访问的特定密钥保管库的 Azure 资源 ID。

可以在 Azure 门户中找到 resourceId 属性的值。 转到“设置>属性”来查找它。 对于 secretName,请使用 Azure 门户中“机密”页上显示的机密名称。

例如,下面的 .http 文件具有使用此机密值的请求。

HTTP
GET {{HostAddress}}{{Path}}
X-AKV-SECRET: {{akvSecret}}

DPAPI 加密

Windows 上的数据保护 API (DPAPI) 可用于加密敏感数据。 使用 DPAPI 加密数据时,加密的值始终特定于计算机,并且它们在 .http 文件中也特定于用户。 这些值无法与其他用户共享。

若要加密值,请使用以下控制台应用程序:

C#
using System.Security.Cryptography;
using System.Text;

string stringToEncrypt = "Hello, World!";
byte[] encBytes = ProtectedData.Protect(Encoding.Unicode.GetBytes(stringToEncrypt), optionalEntropy: null, scope: DataProtectionScope.CurrentUser);
string base64 = Convert.ToBase64String(encBytes);
Console.WriteLine(base64);

前面的控制台应用程序引用了 System.Security.Cryptography.ProtectedData NuGet 包。 若要使加密值能够在 .http 文件中工作,请在加密时将范围设置为 DataProtectionScope.CurrentUser。 加密值是 base64 编码的字符串,可以复制并粘贴到环境文件中。

在环境文件中,创建一个具有 provider 和 value 属性的变量。 将 provider 设置为 Encrypted,并将加密值设置为 value。 例如,以下环境文件定义一个名为 dpapiValue 的变量,它的值获取自使用 DPAPI 加密的字符串。

JSON
{
  "dev": {
    "dpapiValue": {
      "provider": "Encrypted",
      "value": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA5qwfg4+Bhk2nsy6ujgg3GAAAAAACAAAAAAAQZgAAAAEAACAAAAAqNXhXc098k1TtKmaI4cUAbJVALMVP1zOR7mhC1RBJegAAAAAOgAAAAAIAACAAAABKu4E9WC/zX5LYZZhOS2pukxMTF9R4yS+XA9HoYF98GzAAAAAzFXatt461ZnVeUWgOV8M/DkqNviWUUjexAXOF/JfpJMw/CdsizQyESus2QjsCtZlAAAAAL7ns3u9mEk6wSMIn+KNsW/vdAw51OaI+HPVrt5vFvXRilTtvGbU/JnxsoIHj0Z7OOxlwOSg1Qdn60zEqmlFJBg=="
    }
  }
}

在上述环境文件中,dpapiValue 可以像任何其他变量一样在 .http 文件中使用。 例如:

HTTP
GET {{HostAddress}}{{Path}}
X-DPAPI-Secret: {{dpapiSecret}}

发送此请求后,X-DPAPI-Secret 具有解密的机密值。

环境变量

若要获取环境变量的值,请使用 $processEnv。 以下示例将 USERNAME 环境变量的值置于 X-UserName 标头中。

HTTP
GET {{HostAddress}}{{Path}}
X-UserName: {{$processEnv USERNAME}}

如果试图使用 $processEnv 访问不存在的环境变量,.http 文件编辑器将显示一条错误消息。

.env 文件

若要获取 .env 文件中定义的变量的值,请使用 $dotenv。 .env 文件必须位于项目文件夹中。 $dotenv 和 $processEnv 的格式相同。 例如,如果 .env 文件具有以下内容:

USERNAME=userFromDotenv

且 .http 文件包含此内容:

HTTP
GET {{HostAddress}}{{Path}}
X-UserName: {{$dotEnv USERNAME}}

X-UserName 标头将具有“userFromDotenv”。

在编辑器中输入 $dotenv 时,它显示 .env 文件中定义的变量的完成情况。

 备注

默认情况下,可能不会从源代码管理中排除 .env 文件,因此请谨慎避免签入任何机密值。

随机整数

若要生成随机整数,请使用 $randomInt。 语法是 {{$randomInt [min max]}}, min 和 max 值是可选的。

日期和时间

  • $datetime 生成 UTC 格式的 datetime 字符串。 语法是 {{$datetime [format] [offset option]}},其中格式和偏移选项是可选的。
  • $localDatetime 在本地时区中生成 datetime 字符串。 语法是 {{$localDatetime [format] [offset option]}},其中格式和偏移选项是可选的。
  • $timestamp 生成 UTC 格式的 timestamp。 timestamp 是从 Unix 时间戳开始所经过的秒数(UTC 时间)。 语法是 {{$timestamp [offset option]}},其中偏移选项是可选的。

选项 [format] 是 rfc1123iso8601 或用引号表示的自定义格式。 例如:

HTTP
GET https://httpbin.org/headers
X-CUSTOM: {{$datetime "dd-MM-yyyy"}}
X-ISO8601: {{$datetime iso8601}}
X-ISO8601L: {{$localDatetime iso8601}}
X-RFC1123: {{$datetime rfc1123}}
X-RFC1123L: {{$localDatetime rfc1123}}

以下是前面的示例生成的一些示例值:

JSON
{
  "headers": {
    "X-Custom": "17-01-2024",
    "X-Iso8601": "2024-01-17T22:59:55.5345770+00:00",
    "X-Iso8601L": "2024-01-17T14:59:55.5345770-08:00",
    "X-Rfc1123": "Wed, 17 Jan 2024 22:59:55 GMT",
    "X-Rfc1123L": "Wed, 17 Jan 2024 14:59:55 -08"
  }
}

语法 [offset option] 采用 numberunit 形式,其中 number 是整数,unit 是以下值之一:

 
unit说明
ms 毫秒
s
m 分钟
h 时数
d
w
M 数月
y 年数

例如:

HTTP
GET https://httpbin.org/headers
X-Custom-Minus-1-Year: {{$datetime "dd-MM-yyyy" -1 y}}
X-RFC1123-Plus-1-Day: {{$datetime rfc1123 1 d}} 
X-Timestamp-Plus-1-Year: {{$timestamp 1 y}}

以下是前面的示例生成的一些示例值:

JSON
{
  "headers": {
    "X-Custom-Minus-1-Year": "17-01-2023",
    "X-Rfc1123-Plus-1-Day": "Thu, 18 Jan 2024 23:02:48 GMT",
    "X-Timestamp-Plus-1-Year": "1737154968"
  }
}

前面的一些示例使用免费的开源网站 <httpbin.org>。 这是一个与 Microsoft 无关的第三方网站。 在这些示例中,它会返回一个响应正文,其中包含在请求中发送的标头。 有关使用此资源进行 API 测试的其他方法的信息,请参阅 httpbin.org 网站的主页

不支持的语法

Visual Studio 2022 .http 文件编辑器不具备 Visual Studio Code REST 客户端扩展拥有的所有功能。 以下列表包含一些仅在 Visual Studio Code 扩展中可用的更重要的功能:

  • 跨多行的请求行
  • 将文件路径指定为请求正文
  • 使用 multipart/form-data 时正文的混合格式
  • GraphQL 请求
  • cURL 请求
  • 复制/粘贴为 cURL
  • 请求历史记录
  • 将响应正文保存到文件
  • 基于证书的身份验证
  • 提示变量
  • 自定义响应预览
  • 每请求设置

创建 .http 文件

  • 在“解决方案资源管理器”中,右键单击 ASP.NET Core 项目。

  • 在上下文菜单中,选择“添加”“新建项...”。

  • 在“添加新项”对话框中,选择“ASP.NET Core”“常规”。

  • 选择“HTTP 文件”,然后选择“添加”。

    “添加新项”对话框,其中显示了选中的 HTTP 文件类型。

发送 HTTP 请求

  • 向 文件添加至少一个.http并保存该文件。

  • 如果请求 URL 指向 localhost 和项目的端口,请在尝试向其发送请求之前运行项目。

  • 选择直接位于要发送的请求上方的 Send Request 或 Debug 链接。

    请求将发送到指定 URL,响应将显示在编辑器窗口右侧的单独窗格中。

    .http 文件编辑器窗口,其中突出显示“运行”按钮并显示响应窗格。

.http 文件选项

可以配置 .http 文件行为的某些方面。 若要查看可用内容,请转到工具>选项>文本编辑器>其余。 例如,可以在“高级”选项卡上配置超时设置。下面是“选项”对话框的屏幕截图:

“选项”对话框,显示“文本编辑器”和“REST”选项。

使用终结点资源管理器

终结点资源管理器是一个工具窗口,显示 Web API 定义的所有终结点。 借助该工具,可使用 .http 文件将请求发送到终结点。

终结点资源管理器显示的初始终结点集是静态地发现的。 有些终结点无法被静态地发现。 例如,在类库项目中定义的终结点直到运行时才能被发现。 运行或调试 Web API 时,Visual Studio 版本 17.11 预览版还会在运行时动态地发现终结点,并将这些终结点添加到终结点资源管理器。

打开终结点资源管理器

选择“查看”“其他 Windows”>“终结点资源管理器”。

向 .http 文件添加请求

在“终结点资源管理器”中右键单击请求,然后选择“生成请求”。

显示请求上下文菜单的“终结点资源管理器”窗口,其中突出显示了选择的“生成请求”菜单。

  • 如果存在项目名用作文件名的 .http 文件,则会将请求添加到该文件。
  • 否则,会创建项目名用作文件名的 .http 文件,并且将请求添加到该文件。

前面的屏幕截图显示了由最小 API 项目模板定义的终结点。 以下示例显示为所选终结点生成的请求:

HTTP
GET {{WebApplication1_HostAddress}}/weatherforecast/
Accept: application/json

###

本文前面所述发送请求。

另请参阅

 

 

posted on 2023-06-13 15:00  不及格的程序员-八神  阅读(29)  评论(0)    收藏  举报