Uso de archivos .http en Visual Studio 2022
El editor de archivos de Visual Studio 2022 .http
proporciona una manera cómoda de probar proyectos de ASP.NET Core, especialmente las aplicaciones de API. El editor proporciona una interfaz de usuario que:
- Crea y actualiza archivos
.http
. - Envía solicitudes HTTP especificadas en archivos
.http
. - Muestra las respuestas.
Este artículo contiene documentación para lo siguiente:
- La sintaxis del archivo
.http
. - Creación de un archivo
.http
. - Cómo enviar una solicitud desde un archivo
.http
. - Dónde buscar opciones de archivos
.http
configurables.. - Cómo crear solicitudes en archivos
.http
mediante el Explorador de puntos de conexión de Visual Studio 2022.
El formato de archivo .http
y el editor se han inspirado en la extensión REST Client de Visual Studio Code. El editor .http
de Visual Studio 2022 reconoce .rest
como una extensión de archivo alternativa para el mismo formato de archivo.
Requisitos previos
- Versión 17.8 o posterior de Visual Studio 2022 con la carga de trabajo de desarrollo web y ASP.NET instalada.
Sintaxis del archivo .http
En las secciones siguientes se explica la sintaxis del archivo .http
.
Requests
El formato de una solicitud HTTP es HTTPMethod URL HTTPVersion
, todo en una línea, donde:
HTTPMethod
es el método HTTP que se va a usar, por ejemplo:URL
es la dirección URL a la que se va a enviar la solicitud. La dirección URL puede incluir parámetros de cadena de consulta. La dirección URL no tiene que apuntar a un proyecto web local. Puede apuntar a cualquier dirección URL a la que Visual Studio pueda acceder.HTTPVersion
es opcional y especifica la versión HTTP que se debe usar, es decir,HTTP/1.1
,HTTP/2
oHTTP/3
.
Un archivo puede contener varias solicitudes si se usan líneas con ###
como delimitadores. En el ejemplo siguiente se muestran tres solicitudes en un archivo que ilustra esta sintaxis:
GET https://localhost:7220/weatherforecast
###
GET https://localhost:7220/weatherforecast?date=2023-05-11&location=98006
###
GET https://localhost:7220/weatherforecast HTTP/3
###
Encabezados de solicitud
Para agregar uno o varios encabezados, agregue cada uno en su propia línea inmediatamente después de la línea de solicitud. No incluya ninguna línea en blanco entre la línea de solicitud y el primer encabezado, ni entre las líneas de encabezado posteriores. El formato es HeaderName: Value
, como se muestra en los ejemplos siguientes:
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
###
Importante
Al llamar a una API que se autentica con encabezados, no confirme ningún secreto en un repositorio de código fuente. Consulte los métodos admitidos para almacenar secretos más adelante en este artículo, como secretos de usuario de ASP.NET Core, Azure Key Vault y el cifrado DPAPI.
Cuerpo de la solicitud
Agregue el cuerpo de la solicitud después de una línea en blanco, como se muestra en el ejemplo siguiente:
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"
}
###
Comentarios
Las líneas que comienzan por #
o //
son comentarios. Estas líneas se omiten cuando Visual Studio envía solicitudes HTTP.
variables
Una línea que comienza por @
define una variable mediante la sintaxis @VariableName=Value
.
Se puede hacer referencia a variables en las solicitudes definidas más adelante en el archivo. Para hacer referencia a ellas, sus nombres se encapsulan entre llaves dobles, {{
y }}
. En el ejemplo siguiente se muestran dos variables definidas y usadas en una solicitud:
@hostname=localhost
@port=44320
GET https://{{hostname}}:{{port}}/weatherforecast
Las variables se pueden definir mediante valores de otras variables definidas anteriormente en el archivo. En el ejemplo siguiente, en la solicitud se usa una variable, en lugar de las dos que se muestran en el ejemplo anterior:
@hostname=localhost
@port=44320
@host={{hostname}}:{{port}}
GET https://{{host}}/api/search/tool
Archivos de ambiente
Para proporcionar a las variables diferentes valores en distintos entornos, cree un archivo llamado http-client.env.json
. Busque el archivo en el mismo directorio que el archivo .http
o en uno de sus directorios primarios. Este es un ejemplo de un archivo de entorno:
{
"dev": {
"HostAddress": "https://localhost:44320"
},
"remote": {
"HostAddress": "https://contoso.com"
}
}
El archivo de entorno es un archivo JSON que contiene uno o varios entornos con nombre, como "dev" y "remote" en el ejemplo anterior. Cada entorno con nombre contiene una o varias variables, como HostAddress
en el ejemplo anterior. Se hace referencia a las variables de un archivo de entorno de la misma manera que a otras variables, como se muestra en el ejemplo siguiente:
GET {{HostAddress}}/api/search/tool
El valor que se usa para la variable al enviar una solicitud viene determinado por una lista desplegable del selector de entorno en la esquina superior derecha del editor de archivos .http
. En la captura de pantalla siguiente se muestra el selector:
No es necesario que el archivo de entorno esté en la carpeta del proyecto. Visual Studio busca un archivo de entorno en la carpeta donde existe el archivo .http
. Si no está en esa carpeta, Visual Studio examina los directorios primarios para encontrarlo. Cuando se encuentra un archivo llamado http-client.env.json
, finaliza la búsqueda. Se usa el archivo hallado más cerca del archivo .http
.
Después de crear o editar un archivo .http
, es posible que tenga que cerrar y volver a abrir el proyecto para ver los cambios reflejados en el selector de entorno. Presione F6 para seleccionar el selector de entorno.
Visual Studio muestra advertencias en las situaciones siguientes:
- El archivo
.http
hace referencia a una variable que no se define en el archivo.http
o en el archivo de entorno. - El archivo de entorno contiene una variable a la que no se hace referencia en el archivo
.http
.
Una variable definida en un archivo de entorno puede ser igual que una definida en el archivo .http
, o puede ser diferente. Si se define una variable tanto en el archivo .http
como en el archivo de entorno, el valor del archivo .http
reemplaza el valor del archivo de entorno.
Archivos de entorno específicos del usuario
Un valor específico del usuario es cualquier valor con el que un desarrollador individual quiere probar y que no desea compartir con el equipo. Dado que el archivo http-client.env.json
está registrado en el control de código fuente de forma predeterminada, no sería adecuado agregar valores específicos del usuario a este archivo. En su lugar, colóquelos en un archivo llamado http-client.env.json.user
ubicado en la misma carpeta que el archivo http-client.env.json
. Los archivos que finalizan con .user
deben excluirse del control de código fuente de forma predeterminada al usar características de control de código fuente de Visual Studio.
Cuando se carga el archivo http-client.env.json
, Visual Studio busca un archivo http-client.env.json.user
del mismo nivel. Si una variable se define en un entorno tanto en el archivo http-client.env.json
como en el archivo http-client.env.json.user
, gana el valor del archivo http-client.env.json.user
.
Este es un escenario de ejemplo que muestra cómo funciona un archivo de entorno específico del usuario. Supongamos que el archivo .http
tiene el siguiente contenido:
GET {{HostAddress}}/{{Path}}
Accept: application/json
Supongamos también que en el archivo http-client.env.json
se incluye el siguiente contenido:
{
"dev": {
"HostAddress": "https://localhost:7128",
"Path": "/weatherforecast"
},
"remote": {
"HostAddress": "https://contoso.com",
"Path": "/weatherforecast"
}
}
Y, además, supongamos que hay un archivo de entorno específico del usuario en el que se incluye el siguiente contenido:
{
"dev": {
"Path": "/swagger/index.html"
}
}
Cuando el usuario selecciona el entorno "dev", la solicitud se envía a https://localhost:7128/swagger/index.html
porque el valor Path
del archivo http-client.env.json.user
reemplaza el valor del archivo http-client.env.json
.
Con los mismos archivos de entorno, supongamos que las variables se definen en el archivo .http
:
@HostAddress=https://contoso.com
@Path=/weatherforecast
GET {{HostAddress}}/{{Path}}
Accept: application/json
En este escenario, la solicitud de entorno "dev" se envía a https://contoso.com/weatherforecast
porque las definiciones de variables de los archivos .http
reemplazan las definiciones de los archivos de entorno.
Secretos de usuario de ASP.NET Core
Para obtener un valor de los secretos de usuario, use un archivo de entorno que se encuentre en la misma carpeta que el proyecto de ASP.NET Core. En el archivo de entorno, defina una variable que tenga las propiedades provider
y secretName
. Establezca el valor provider
en AspnetUserSecrets
y secretName
en el nombre del secreto de usuario deseado. Por ejemplo, el siguiente archivo de entorno define una variable llamada ApiKeyDev
que obtiene su valor del secreto de usuario config:ApiKeyDev
:
{
"dev": {
"ApiKeyDev": {
"provider": "AspnetUserSecrets",
"secretName": "config:ApiKeyDev"
}
}
}
Para usar esta variable en el archivo .http
, haga referencia a ella como variable estándar. Por ejemplo:
GET {{HostAddress}}{{Path}}
X-API-KEY: {{ApiKeyDev}}
Cuando se envía la solicitud, el valor del secreto ApiKeyDev
se encuentra en el encabezado X-API-KEY.
Al escribir en el archivo http
, el editor muestra una lista de finalización para el nombre de la variable, pero no muestra su valor.
Azure Key Vault
Azure Key Vault es una de las diversas soluciones de administración de claves de Azure que se pueden usar para la administración de secretos. De los tres almacenes de secretos que se admiten actualmente para los archivos .http
, Key Vault es la mejor opción para compartir secretos entre distintos usuarios. Las otras dos opciones, secretos de usuario de ASP.NET y cifrado DPAPI, no se comparten fácilmente.
Para usar un valor de Azure Key Vault, debe haber iniciado sesión en Visual Studio con una cuenta que tenga acceso a la instancia de Key Vault deseada.
Defina una variable en un archivo de entorno con los metadatos para acceder al secreto. La variable lleva por nombre AKVSecret
en el siguiente ejemplo:
{
"dev": {
"AKVSecret": {
"provider": "AzureKeyVault",
"secretName": "SecretInKeyVault",
"resourceId": "/subscriptions/3a914c59-8175a9e0e540/resourceGroups/my-key-vault-rg/providers/Microsoft.KeyVault/vaults/my-key-vault-01182024"
}
}
}
La variable AKVSecret
extrae su valor de Azure Key Vault. Las siguientes propiedades se definen en AKVSecret
:
Nombre | Descripción |
---|---|
proveedor | Para Key Vault, use AzureKeyVault siempre. |
secretName | Nombre del secreto que se va a extraer. |
resourceId | Identificador de recurso de Azure para que acceda la instancia de Key Vault específica. |
El valor de la propiedad resourceId
se puede encontrar en Azure Portal. Vaya a Configuración > Propiedades para encontrarlo. Para secretName
, use el nombre del secreto que aparece en la página Secretos de Azure Portal.
Por ejemplo, el archivo .http
siguiente tiene una solicitud que usa este valor del secreto.
GET {{HostAddress}}{{Path}}
X-AKV-SECRET: {{akvSecret}}
Cifrado DPAPI
En Windows, hay una API de protección de datos (DPAPI) que se puede usar para cifrar datos confidenciales. Cuando DPAPI se usa para cifrar los datos, los valores cifrados siempre son específicos de la máquina y también son específicos del usuario en los archivos .http
. Estos valores no se pueden compartir con otros usuarios.
Para cifrar un valor, use la siguiente aplicación de consola:
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);
La aplicación de consola anterior hace referencia al paquete NuGet System.Security.Cryptography.ProtectedData. Para permitir que el valor cifrado funcione en el archivo .http
, cifre con el ámbito establecido en DataProtectionScope.CurrentUser. El valor cifrado es una cadena codificada en base64 que se puede copiar y pegar en el archivo de entorno.
En el archivo de entorno, cree una variable que tenga las propiedades provider
y value
. Establezca provider
en Encrypted
y value
en el valor cifrado. Por ejemplo, el siguiente archivo de entorno define una variable llamada dpapiValue
que obtiene su valor de una cadena cifrada con DPAPI.
{
"dev": {
"dpapiValue": {
"provider": "Encrypted",
"value": "AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA5qwfg4+Bhk2nsy6ujgg3GAAAAAACAAAAAAAQZgAAAAEAACAAAAAqNXhXc098k1TtKmaI4cUAbJVALMVP1zOR7mhC1RBJegAAAAAOgAAAAAIAACAAAABKu4E9WC/zX5LYZZhOS2pukxMTF9R4yS+XA9HoYF98GzAAAAAzFXatt461ZnVeUWgOV8M/DkqNviWUUjexAXOF/JfpJMw/CdsizQyESus2QjsCtZlAAAAAL7ns3u9mEk6wSMIn+KNsW/vdAw51OaI+HPVrt5vFvXRilTtvGbU/JnxsoIHj0Z7OOxlwOSg1Qdn60zEqmlFJBg=="
}
}
}
Con el archivo de entorno anterior, dpapiValue
se puede usar en el archivo .http
como cualquier otra variable. Por ejemplo:
GET {{HostAddress}}{{Path}}
X-DPAPI-Secret: {{dpapiSecret}}
Cuando se envía esta solicitud, X-DPAPI-Secret tiene el valor del secreto descifrado.
Variables de entorno
Para obtener el valor de una variable de entorno, use $processEnv
. En el ejemplo siguiente se coloca el valor de la variable de entorno USERNAME en el encabezado X-UserName.
GET {{HostAddress}}{{Path}}
X-UserName: {{$processEnv USERNAME}}
Si intenta usar $processEnv
para acceder a una variable de entorno que no existe, se mostrará un mensaje de error en el editor de archivos .http
.
archivos .env
Para obtener el valor de una variable que se define en un archivo .env
, use $dotenv
. El archivo .env
debe estar en la carpeta del proyecto. El formato de $dotenv
es igual que el de $processEnv
. Por ejemplo, si el archivo .env
tiene este contenido:
USERNAME=userFromDotenv
Y el archivo .http
tiene este contenido:
GET {{HostAddress}}{{Path}}
X-UserName: {{$dotEnv USERNAME}}
El encabezado X-UserName
tendrá "userFromDotenv".
Cuando $dotenv
se escribe en el editor, muestra finalizaciones para las variables definidas en el archivo .env
.
Nota:
Es posible que los archivos .env
no se excluyan del control de código fuente de forma predeterminada, por lo que debe tener cuidado de no registrar ningún valor del secreto.
Enteros aleatorios
Para generar un entero aleatorio, use $randomInt
. La sintaxis es {{$randomInt [min max]}}
donde los valores min
y max
son opcionales.
Fechas y horas
$datetime
genera una cadenadatetime
en UTC. La sintaxis es{{$datetime [format] [offset option]}}
donde las opciones de formato y desplazamiento son opcionales.$localDatetime
genera una cadenadatetime
en la zona horaria local. La sintaxis es{{$localDatetime [format] [offset option]}}
donde las opciones de formato y desplazamiento son opcionales.$timeStamp
genera unatimestamp
en UTC. Latimestamp
es el número de segundos desde la época unix en hora UTC. La sintaxis es{{$timestamp [offset option]}}
donde la opción de desplazamiento es opcional.
La opción [format]
es una de rfc1123
, iso8601
o un formato personalizado entre comillas. Por ejemplo:
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}}
Estos son algunos valores de muestra que generan los ejemplos anteriores:
{
"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"
}
}
La sintaxis [offset option]
está en forma de number
unit
donde number
es un entero y unit
es uno de los siguientes valores:
unit |
Explicación |
---|---|
ms |
Milisegundos |
s |
Segundos |
m |
Minutos |
h |
horas |
d |
Días |
w |
Semanas |
M |
Meses |
y |
Años |
Por ejemplo:
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}}
Estos son algunos valores de muestra que generan los ejemplos anteriores:
{
"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"
}
}
En algunos de los ejemplos anteriores se usa el sitio web de código abierto gratuito <httpbin.org>. Se trata de un sitio web de terceros no afiliado a Microsoft. En estos ejemplos, devuelve un cuerpo de respuesta con los encabezados que se enviaron en la solicitud. Para obtener información sobre otras formas de usar este recurso para pruebas de API, consulta la página home del sitio httpbin.org.
Sintaxis no admitida
El editor de archivos .http
de Visual Studio 2022 no tiene todas las características que tiene la extensión REST Client de Visual Studio Code. En la lista siguiente se incluyen algunas de las características más significativas disponibles solo en la extensión Visual Studio Code:
- Línea de solicitud que abarca más de una línea
- Solicitudes con nombre
- Especificar la ruta de acceso del archivo como cuerpo de la solicitud
- Formato mixto para el cuerpo cuando se usan datos de varias partes o formularios
- Solicitudes de GraphQL
- Solicitud cURL
- Copiar y pegar como cURL
- Historial de solicitudes
- Guardar el cuerpo de la respuesta en el archivo
- Autenticación basada en certificados
- Solicitud de variables
- Personalización de la vista previa de respuesta
- Configuración de cada solicitud
Creación de un archivo .http
En el Explorador de soluciones, haga clic con el botón derecho en un proyecto de ASP.NET Core.
En el menú contextual, seleccione Agregar>Nuevo elemento.
En el cuadro de diálogo Agregar nuevo elemento, seleccione ASP.NET Core>General.
Seleccione Archivo HTTP y después Agregar.
Enviar una solicitud HTTP
Agregue al menos una solicitud a un archivo
.http
y guárdelo.Si la dirección URL de la solicitud apunta a localhost y al puerto del proyecto, ejecute el proyecto antes de intentar enviarle una solicitud.
Seleccione el vínculo
Send Request
oDebug
situado directamente encima de la solicitud que se va a enviar.La solicitud se envía a la dirección URL especificada y la respuesta aparece en un panel independiente a la derecha de la ventana del editor.
Opciones de archivos .http
Se pueden configurar algunos aspectos del comportamiento de los archivos .http
. Para ver qué está disponible, ve a Herramientas>Opciones>Editor de texto>Rest. Por ejemplo, la opción de tiempo de espera se puede configurar en la pestaña Avanzada. Esta es una captura de pantalla del cuadro de diálogo Opciones:
Uso del Explorador de puntos de conexión
El Explorador de puntos de conexión es una ventana de herramientas que muestra todos los puntos de conexión que define una API web. La herramienta permite enviar solicitudes a los puntos de conexión mediante un archivo .http
.
El conjunto inicial de puntos de conexión que muestra el Explorador de puntos de conexión se detecta estáticamente. Hay algunos puntos de conexión que no se pueden detectar estáticamente. Por ejemplo, los puntos de conexión definidos en un proyecto de biblioteca de clases no se pueden detectar hasta el runtime. Al ejecutar o depurar una API web, la versión preliminar de Visual Studio 17.11 detecta los puntos de conexión dinámicamente en tiempo de ejecución y los agrega al Explorador de puntos de conexión.
Apertura del Explorador de puntos de conexión
Seleccione Ver>Otras ventanas>Explorador de puntos de conexión.
Adición de una solicitud a un archivo .http
Haga clic con el botón derecho en una solicitud en el Explorador de puntos de conexión y seleccione Generar solicitud.
- Si existiera un archivo
.http
con el nombre del proyecto como nombre de archivo, la solicitud se agregará a ese archivo. - En caso contrario, se creará un archivo
.http
con el nombre del proyecto como nombre de archivo y la solicitud se agregará a ese archivo.
En la captura de pantalla anterior se muestran los puntos de conexión definidos por la plantilla de proyecto de API mínima. En el ejemplo siguiente se muestra la solicitud que se genera para el punto de conexión seleccionado:
GET {{WebApplication1_HostAddress}}/weatherforecast/
Accept: application/json
###
Envíe la solicitud como se ha descrito antes en este artículo.