Establecer cuerpo
SE APLICA A: todos los niveles de API Management
Use la directiva set-body
para establecer el cuerpo del mensaje para una solicitud o respuesta. Para acceder al cuerpo del mensaje, puede utilizar las propiedades context.Request.Body
o context.Response.Body
, según si la directiva se encuentra en la sección entrante o saliente.
Importante
De forma predeterminada, al acceder al cuerpo del mensaje mediante context.Request.Body
o context.Response.Body
, se pierde el cuerpo del mensaje original, por lo que es preciso establecerlo, para lo que se devuelve el cuerpo en la expresión. Para conservar el contenido del cuerpo, establezca el parámetro preserveContent
en true
al acceder al mensaje. Si preserveContent
está establecido en true
y la expresión devuelve un cuerpo distinto, se utiliza el que se devuelva.
Nota
Establezca los elementos de la directiva y los elementos secundarios en el orden proporcionado en la instrucción de directiva. Obtenga más información sobre el establecimiento o modificación de directivas de API Management.
Instrucción de la directiva
<set-body template="liquid" xsi-nil="blank | null" parse-date="true | false">
new body value as text
</set-body>
Atributos
Atributo | Descripción | Necesario | Valor predeterminado |
---|---|---|---|
template | Se utiliza para cambiar el modo de creación de plantillas que ejecutará la directiva set-body . Actualmente, el único valor admitido es:- liquid : la directiva set-body usará el motor de plantillas liquid |
No | N/D |
xsi-nil | Se usa para controlar cómo se representan los elementos marcados con xsi:nil="true" en cargas XML. Seleccione uno de los siguientes valores:- blank - nil se representa con una cadena vacía.- null - nil se representa con un valor NULL.No se permiten expresiones de directiva. |
No | blank |
parse-date | booleano. Especifica si las cadenas con formato de fecha (por ejemplo, "/Date(1198908717056)/" , "2012-03-21T05:40Z" ) se analizan en System.DateTime (mm/dd/yyyy hh:mm:ss ). Cuando se establece en false , los valores de fecha se copian simplemente.No se permiten expresiones de directiva. |
No | true |
Para acceder a información sobre solicitud y respuesta, la plantilla Liquid puede enlazar a un objeto de contexto con las siguientes propiedades:
context. Request. Url Method OriginalMethod OriginalUrl IpAddress MatchedParameters HasBody ClientCertificates Headers Response. StatusCode Method Headers Url. Scheme Host Port Path Query QueryString ToUri ToString OriginalUrl. Scheme Host Port Path Query QueryString ToUri ToString
Uso
- Secciones de la directiva: entrante, saliente y back-end
- Ámbitos de la directiva: global, área de trabajo, producto, API, operación
- Puertas de enlace: clásica, v2, consumo, autohospedada y área de trabajo
Notas de uso
- Si usa la directiva
set-body
para devolver un cuerpo nuevo o actualizado, no hay que establecerpreserveContent
entrue
porque estará especificando explícitamente el nuevo contenido del cuerpo. - No tiene sentido conservar el contenido de una respuesta en la canalización de entrada porque todavía no hay ninguna respuesta.
- De igual modo, no tiene sentido conservar el contenido de una solicitud en la canalización de salida porque la solicitud ya se ha enviado al servidor en este momento.
- Si esta directiva se usa cuando no haya ningún cuerpo de mensaje, por ejemplo, en un
GET
entrante, se producirá una excepción.
Para obtener más información, consulte las secciones context.Request.Body
, context.Response.Body
y IMessageBody
de la tabla context.Request.Body
(Variable de contexto).
Uso de plantillas Liquid con set-body
La directiva set-body
se puede configurar para usar el lenguaje de plantillas set-body
para transformar el cuerpo de una solicitud o una respuesta. Esto puede ser eficaz si tiene que cambiar completamente el formato del mensaje.
Importante
La implementación de Liquid que se utiliza en la directiva set-body
está configurada en el modo de C#. Esto es especialmente importante al realizar tareas como el filtrado. Por ejemplo, para usar un filtro de fecha se requiere usar las mayúsculas y minúsculas de Pascal y el formato de fecha de C#; por ejemplo:
{{body.foo.startDateTime| Date:"yyyyMMddTHH:mm:ssZ"}}
Importante
Para enlazar correctamente con un cuerpo XML mediante la plantilla Liquid, use una directiva set-header
para establecer que Content-Type sea application/xml, text/xml (o cualquier tipo que termine en +xml); para un cuerpo JSON, debe ser application/json, texto/json (o cualquier tipo que termine en +json).
Importante
Las plantillas líquidas usan el cuerpo de la solicitud o respuesta en la canalización de ejecución actual como entrada. Por este motivo, las plantillas líquidas no funcionan cuando se usan dentro de una directiva de respuesta de retorno. Una directiva de respuesta de retorno cancela la canalización de ejecución actual y quita el cuerpo de la solicitud o respuesta. Como resultado, cualquier plantilla líquida usada dentro de la respuesta de retorno recibirá una cadena vacía como entrada y no generará la salida esperada.
Filtros de Liquid admitidos
En la directiva set-body
, se admiten los siguientes filtros de Liquid. Para ver ejemplos de filtros, consulte la documentación de Liquid.
Nota:
La directiva requiere el uso de mayúsculas y minúsculas de Pascal para los nombres de filtro de Liquid (por ejemplo, "AtLeast" en lugar de "at_least").
- Abs
- Anexar
- AtLeast
- AtMost
- Capitalize
- Compacto
- Moneda
- Date
- Valor predeterminado
- DividedBy
- Downcase
- Escape
- First
- H
- Join
- Último
- Lstrip
- Asignación
- Resta
- Módulo
- NewlineToBr
- Plus
- Prepend
- Quitar
- RemoveFirst
- Replace
- ReplaceFirst
- Round
- Rstrip
- Size
- Segmento
- Sort
- Dividir
- Strip
- StripHtml
- StripNewlines
- Horas
- Truncate
- TruncateWords
- Uniq
- Upcase
- UrlDecode
- UrlEncode
Ejemplos
Texto literal
<set-body>Hello world!</set-body>
Acceso al cuerpo como una cadena
Estamos conservando el cuerpo de la solicitud original para que resulte accesible más adelante en la canalización.
<set-body>
@{
string inBody = context.Request.Body.As<string>(preserveContent: true);
if (inBody[0] =='c') {
inBody[0] = 'm';
}
return inBody;
}
</set-body>
Acceso al cuerpo como un elemento JObject
Al no conservar el cuerpo de la solicitud original, el acceso posterior al mismo en la canalización producirá una excepción.
<set-body>
@{
JObject inBody = context.Request.Body.As<JObject>();
if (inBody.attribute == <tag>) {
inBody[0] = 'm';
}
return inBody.ToString();
}
</set-body>
Filtro de respuesta según un producto
En este ejemplo se muestra cómo filtrar contenido quitando elementos de datos de la respuesta recibida del servicio back-end al usar el producto Starter
. En la respuesta de back-end de ejemplo se incluyen propiedades de nivel raíz similares a One Call API de OpenWeather.
<!-- Copy this snippet into the outbound section to remove a number of data elements from the response received from the backend service based on the name of the product -->
<choose>
<when condition="@(context.Response.StatusCode == 200 && context.Product.Name.Equals("Starter"))">
<set-body>@{
var response = context.Response.Body.As<JObject>();
foreach (var key in new [] {"current", "minutely", "hourly", "daily", "alerts"}) {
response.Property (key).Remove ();
}
return response.ToString();
}
</set-body>
</when>
</choose>
Conversión de JSON en SOAP mediante una plantilla Liquid
<set-body template="liquid">
<soap:Envelope xmlns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetOpenOrders>
<cust>{{body.getOpenOrders.cust}}</cust>
</GetOpenOrders>
</soap:Body>
</soap:Envelope>
</set-body>
Transformación de JSON mediante una plantilla Liquid
<set-body template="liquid">
{
"order": {
"id": "{{body.customer.purchase.identifier}}",
"summary": "{{body.customer.purchase.orderShortDesc}}"
}
}
</set-body>
Acceso al cuerpo como datos de formulario con codificación de URL
En el ejemplo siguiente se usa la expresión AsFormUrlEncodedContent()
para acceder al cuerpo de la solicitud como datos de formulario con codificación de URL (tipo application/x-www-form-urlencoded
de contenido) y, después, se convierte en JSON. Al no conservar el cuerpo de la solicitud original, el acceso posterior al mismo en la canalización producirá una excepción.
<set-body>
@{
var inBody = context.Request.Body.AsFormUrlEncodedContent();
return JsonConvert.SerializeObject(inBody);
}
</set-body>
Obtener acceso y devolver el cuerpo como datos de formulario codificados con URL
En el ejemplo siguiente se usa la expresión AsFormUrlEncodedContent()
para tener acceso al cuerpo de la solicitud como datos de formulario con codificación URL (tipo de contenido application/x-www-form-urlencoded
), se agregan datos a la carga y se devuelven datos de formulario con codificación URL. Al no conservar el cuerpo de la solicitud original, el acceso posterior al mismo en la canalización producirá una excepción.
<set-body>
@{
var body = context.Request.Body.AsFormUrlEncodedContent();
body["newKey"].Add("newValue");
return body.ToFormUrlEncodedContent();
}
</set-body>
Directivas relacionadas
Contenido relacionado
Para más información sobre el trabajo con directivas, vea:
- Tutorial: Transformación y protección de una API
- Referencia de directivas para una lista completa de instrucciones de directivas y su configuración
- Expresiones de directiva
- Establecimiento o edición de directivas
- Reutilización de configuraciones de directivas
- Repositorio de fragmentos de código de directiva
- Kit de herramientas de directivas de Azure API Management
- Creación de directivas mediante Microsoft Copilot en Azure