Estás viendo la documentación de Apigee Edge.
Ir a la
documentación de Apigee X. info
Síntoma
La llamada a la API desde el portal para desarrolladores integrado falla con
Unknown Error o una respuesta vacía en el
Probar esta API
panel.
Mensajes de error
Es posible que veas una respuesta vacía o el siguiente mensaje de error para las solicitudes a la API en el portal integrado:
Unknown Error
En la pestaña Herramientas para desarrolladores > Consola, verás el siguiente error:
Access to XMLHTTPRequest at 'API_URL' from origin 'URL_of_Integrated_DevPortal' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Un mensaje de error genérico como se ve en la pestaña Herramientas para desarrolladores > Consola es el siguiente:
Causas posibles
| Causa | Descripción | Instrucciones de solución de problemas aplicables para |
|---|---|---|
| Falla de política no controlada | La respuesta de error predeterminada se envía sin encabezados de CORS cuando falla alguna política en el flujo de tiempo de ejecución de la solicitud a la API. | Usuarios de la nube pública de Edge |
| Valores múltiples para Access-Control-Allow-Origin | Usa Add en lugar de Set en la política AssignMessage. | Usuarios de la nube pública de Edge |
Causa: Falla de política no controlada
Diagnóstico
- Verifica que el problema solo ocurra si se espera una respuesta que no sea
2XX. - Para las solicitudes con errores, verifica que haya políticas en el flujo del proxy.
-
Realiza un seguimiento de la solicitud y verifica si una política con
continueOnError="false"falla y genera una falla. - Si es así, verifica si la política AssignMessage CORS se ejecutó o no en el flujo de respuesta de error.
- Si no es así, esa es la causa de este problema.
Esto se debe a que, cuando falla alguna política con el elementocontinueOnError="false", la solicitud ingresa al flujo de respuesta de error. Si no hay un manejo de fallas explícito en el flujo de respuesta de error, se envía la respuesta de error predeterminada correspondiente a la política. Esta respuesta de error no tiene encabezados de CORS. Como resultado, la llamada a la API desde el portal para desarrolladores integrado falla conUnknown error.
En las siguientes capturas de pantalla, se muestra un ejemplo de mensaje de error y un ejemplo de mensaje de éxito.
Ejemplo de mensaje de error en el panel Probar esta API del portal integrado y en la ventana Trace del proxy:
Ejemplo de mensaje de éxito en el panel Probar esta API del portal integrado y en la ventana Trace del proxy:
Solución
- En lugar de depender del mensaje de error predeterminado, se debe implementar una regla de falla para controlar la respuesta de error. Incluye una política AssignMessage CORS con los encabezados adecuados y la invoca en FaultRule.
- A veces, es posible que no sea factible tener una regla de falla definida para cada falla; por lo tanto, se puede implementar una regla de falla predeterminada para ejecutar la política AssignMessage CORS:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="proxy-endpoint-name">
<Description/>
<!-- Add a default fault rule to add CORS -->
<DefaultFaultRule name="fault-rule">
<Step>
<Name>add-cors</Name>
</Step>
</DefaultFaultRule>
<FaultRules/>
<!--
<Flows />
Rest of the proxy definition
-->
</ProxyEndpoint>Causa: Valores múltiples para Access-Control-Allow-Origin
Diagnóstico
- Verifica el valor del encabezado Access-Control-Allow-Origin en una sesión de seguimiento.
- El encabezado Access-Control-Allow-Origin solo permite establecer un valor único para ser establecido. Si se establece más de un valor, se puede causar un problema de CORS y el portal para desarrolladores no podrá renderizar ninguna respuesta.
- Si el valor del encabezado Access-Control-Allow-Origin en el seguimiento
se ve de la siguiente manera:
*,*eso significa que tanto el servidor de destino como la política AssignMessage CORS establecen su valor. - Esto podría suceder cuando un usuario usó el
<Add> elementpara Access-Control-Allow-Origin en una política, o el backend establece varios valores.
Ejemplo de Access-Control-Allow-Origin igual a *,*:
Ejemplo de Access-Control-Allow-Origin igual a *:
Ejemplo con <Add>:
Ejemplo con <Set>:
Solución
- El enfoque recomendado es usar el
<Set> element(en lugar del<Add> element) para Access-Control-Allow-Origin ya que solo se permite un valor único. - Como alternativa, establece el encabezado Access-Control-Allow-Origin en un solo lugar: la política AssignMessage CORS o el servidor de destino.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <AssignMessage async="false" continueOnError="false" enabled="true" name="set-cors"> <DisplayName>Set CORS</DisplayName> <FaultRules/> <Properties/> <Set> <Headers> <Header name="Access-Control-Allow-Origin">*</Header> </Headers> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
Si aún necesitas asistencia de Apigee, consulta Se debe recopilar información de diagnóstico.
Se debe recopilar información de diagnóstico
Recopila la siguiente información de diagnóstico y, luego, comunícate con Asistencia de Apigee Edge:
- Nombre de la organización
- Nombre del entorno
- Nombre del proxy de API
- Comando curl completo que se usó para reproducir el error
- Archivo de seguimiento de las solicitudes a la API
- Resultado completo de la respuesta del servidor de destino o backend junto con el tamaño de la carga útil