Estás consultando la documentación de Apigee y Apigee Hybrid.
Consulta la documentación de
Apigee Edge.
Los encabezados HTTP son pares de nombre y valor que permiten que las aplicaciones cliente y los servicios de backend transfieran información adicional sobre las solicitudes y las respuestas, respectivamente. Estos son algunos ejemplos sencillos:
- El encabezado de solicitud de autorización envía las credenciales del usuario al servidor:
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
- El encabezado
Content-Typeindica el tipo de contenido de la solicitud o respuesta que se envía:Content-Type: application/json
Los encabezados HTTP pueden tener uno o varios valores en función de las definiciones de los campos de encabezado. Un encabezado con varios valores tendrá valores separados por comas. A continuación se muestran algunos ejemplos de encabezados que contienen varios valores:
Cache-Control: no-cache, no-store, must-revalidateAccept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8X-Forwarded-For: 10.125.5.30, 10.125.9.125
Apigee permite a los desarrolladores acceder a los encabezados fácilmente mediante variables de flujo en cualquiera de las políticas o flujos condicionales. A continuación, se muestra la lista de variables que se pueden usar para acceder a un encabezado de solicitud o respuesta específico en Apigee:
Variables de flujo:
message.header.header-namerequest.header.header-nameresponse.header.header-namemessage.header.header-name.Nrequest.header.header-name.Nresponse.header.header-name.N
Objetos de JavaScript:
context.proxyRequest.headers.header-namecontext.targetRequest.headers.header-namecontext.proxyResponse.headers.header-namecontext.targetResponse.headers.header-name
A continuación, se muestra un ejemplo de la política AssignMessage que muestra cómo leer el valor de un encabezado de solicitud y almacenarlo en una variable:
<AssignMessage continueOnError="false" enabled="true" name="assign-message-default"> <AssignVariable> <Name>reqUserAgent</Name> <Ref>request.header.User-Agent</Ref> </AssignVariable> </AssignMessage>
Antipatrón
Acceder a los valores de los encabezados HTTP en las políticas de Apigee de forma que solo se devuelva el primer valor es incorrecto y puede causar problemas si el encabezado HTTP específico tiene más de un valor.
En las siguientes secciones se incluyen ejemplos de acceso a encabezados.
Ejemplo 1: Leer un encabezado Accept con varios valores mediante código JavaScript
Supongamos que el encabezado Accept tiene varios valores, como se muestra a continuación:
Accept: text/html, application/xhtml+xml, application/xml
Este es el código JavaScript que lee el valor del encabezado Accept:
// Read the values from Accept header var acceptHeaderValues = context.getVariable("request.header.Accept");
El código JavaScript anterior devuelve solo el primer valor del encabezado Accept, como text/html.
Ejemplo 2: Leer un encabezado Access-Control-Allow-Headers con varios valores en una política AssignMessage o RaiseFault
Supongamos que el encabezado Access-Control-Allow-Headers tiene varios valores, como se muestra a continuación:
Access-Control-Allow-Headers: content-type, authorization
A continuación, se muestra la parte del código de la política AssignMessage o RaiseFault que define el encabezado Access-Control-Allow-Headers:
<Set>
<Headers>
<Header name="Access-Control-Allow-Headers">{request.header.Access-Control-Request-Headers}</Header>
</Headers>
</Set>El código anterior asigna el encabezado Access-Control-Allow-Headers solo con el primer valor del encabezado de solicitud Access-Control-Allow-Headers, que en este ejemplo es content-type.
Impacto
- En ambos ejemplos anteriores, solo se devuelve el primer valor de los encabezados con varios valores. Si estos valores los usa posteriormente otra política en el flujo del proxy de API o el servicio backend para realizar alguna función o lógica, podría dar lugar a un resultado inesperado.
- Cuando se accede a los valores de los encabezados de las solicitudes y se transfieren al servidor de destino, el backend podría procesar las solicitudes a la API de forma incorrecta y, por lo tanto, podrían dar resultados incorrectos.
- Si la aplicación cliente depende de valores de encabezado específicos de la respuesta de Apigee, es posible que también se procese de forma incorrecta y dé resultados incorrectos.
Práctica recomendada
Consulta la forma
request.header.header_name.values.stringde la variable de flujo para leer todos los valores de un encabezado específico.Ejemplo: Fragmento de muestra que se podría usar en RaiseFault o AssignMessage para leer un encabezado de varios valores
<Set> <Headers> <Header name="Inbound-Headers">{request.header.Accept.values.string}</Header> </Headers> </Set>Si quieres acceder individualmente a cada uno de los valores distintos, puedes usar las variables de flujo integradas correspondientes:
request.header.header_name.values.count,request.header.header_name.N,response.header.header_name.values.countyresponse.header.header_name.N.A continuación, itera para obtener todos los valores de un encabezado específico en las políticas de JavaScript o JavaCallout.
Ejemplo: código JavaScript de muestra para leer un encabezado con varios valores
for (var i = 1; i <=context.getVariable('request.header.Accept.values.count'); i++) { print(context.getVariable('request.header.Accept.' + i)); }
Por ejemplo,
application/xml;q=0.9, */*;q=0.8se mostrará como dos valores con el código anterior. El primer valor esapplication/xml;q=0.9y el segundo será*/*;q=0.8.Si los valores de encabezado deben dividirse usando el punto y coma como delimitador, puede usar
string.split(";")en la llamada JavaScript para separar los distintos valores.Como alternativa, puedes usar la función
substring()disponible en una plantilla de mensaje de la variable de flujorequest.header.header_name.valuespara leer todos los valores de un encabezado específico.Ejemplo: Usar
substring()en una plantilla de mensaje para leer un encabezado de varios valores completo<Set> <Headers> <Header name="Inbound-Headers">{substring(request.header.Accept.values,1,-1)}</Header> </Headers> </Set>
Más información
- ¿Cómo se gestionan los encabezados con varios valores en JavaScript?
- Comentario de IETF RFC 7230 sobre el uso de listas separadas por comas para campos de encabezado HTTP con varios valores
- Variables de solicitud y respuesta
- Referencia de variables de flujo