vuelo prevuelo lista español chequeo checklist cessna avion auxiliares api documentation cors apigee preflight

prevuelo - Solicitudes de Opciones de Pre-Vuelo de Apigee



manual del avion cessna 172 en español (1)

Creo proxys api y marque la casilla que dice "Habilitar el acceso directo al navegador para su API - Permitir solicitudes directas desde un navegador a través de CORS". pero mis solicitudes OPCIONES siguen fallando con:

{ "fault": { "faultstring": "Received 405 Response without Allow Header", "detail": { "errorcode": "protocol.http.Response405WithoutAllowHeader" } } }

Por lo que entiendo acerca de las solicitudes de Opciones previas al vuelo de CORS, el cliente primero envía la solicitud de OPCIONES al servidor como salvaguarda para CORS "seguro". Esta solicitud debe devolver una respuesta con la lista de tipos de solicitud que están disponibles.

Mi pregunta: ¿Cómo lo hago para que Apigee responda correctamente a las solicitudes OPTIONS y no pase la solicitud OPTIONS a mi api detrás del proxy? . Si me ayuda, tengo aplicaciones javascript de AngularJS que intentan comunicarse con mi endpoint de Apigee.

Errores de Javascript:

OPTIONS http://api.example.com No ''Access-Control-Allow-Origin'' header is present on the requested resource. Origin ''http://client.example.com'' is therefore not allowed access. XMLHttpRequest cannot load http://api.example.com. No ''Access-Control-Allow-Origin'' header is present on the requested resource. Origin ''http://client.example.com'' is therefore not allowed access.

Valor predeterminado "Agregar CORS" xml

<AssignMessage async="false" continueOnError="false" enabled="true" name="Add-CORS"> <DisplayName>Add CORS</DisplayName> <FaultRules/> <Properties/> <Add> <Headers> <Header name="Access-Control-Allow-Origin">*</Header> <Header name="Access-Control-Allow-Headers">origin, x-requested-with, accept</Header> <Header name="Access-Control-Max-Age">3628800</Header> <Header name="Access-Control-Allow-Methods">GET, PUT, POST, DELETE</Header> </Headers> </Add> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>

Puntos finales proxy predeterminados xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ProxyEndpoint name="default"> <Description/> <Flows/> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <HTTPProxyConnection> <BasePath>/v1/cnc</BasePath> <VirtualHost>default</VirtualHost> <VirtualHost>secure</VirtualHost> </HTTPProxyConnection> <RouteRule name="default"> <TargetEndpoint>default</TargetEndpoint> </RouteRule> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> </ProxyEndpoint>

Valor predeterminado Target Endpoint xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <TargetEndpoint name="default"> <Description/> <Flows/> <PreFlow name="PreFlow"> <Request/> <Response> <Step> <Name>Add-CORS</Name> </Step> </Response> </PreFlow> <HTTPTargetConnection> <URL>http://api.example.com/v1/assets.json</URL> </HTTPTargetConnection> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> </TargetEndpoint>


Como no desea que la solicitud OPTIONS pase a la API backend, se necesitan dos cosas:

  1. Una RouteRule a un objetivo nulo con condición para la solicitud OPTIONS. Observe que no se ha especificado TargetEndpoint.

    <RouteRule name="NoRoute"> <Condition>request.verb == "OPTIONS"</Condition> </RouteRule>

  2. Un flujo personalizado en ProxyEndpoint para manejar la respuesta CORS. Como la nueva RouteRule envía el mensaje a un Target nulo (devuelve la solicitud al cliente), el mensaje no se enrutará al ''Target'' Endpoint ''predeterminado'' donde actualmente se define la política CORS.

Una versión actualizada de su ProxyEndpoint se vería como a continuación:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ProxyEndpoint name="default"> <Description/> <Flows> <Flow name="OptionsPreFlight"> <Request/> <Response> <Step> <Name>Add-CORS</Name> </Step> </Response> <Condition>request.verb == "OPTIONS"</Condition> </Flow> </Flows> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <HTTPProxyConnection> <BasePath>/v1/cnc</BasePath> <VirtualHost>default</VirtualHost> <VirtualHost>secure</VirtualHost> </HTTPProxyConnection> <RouteRule name="NoRoute"> <Condition>request.verb == "OPTIONS"</Condition> </RouteRule> <RouteRule name="default"> <TargetEndpoint>default</TargetEndpoint> </RouteRule> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> </ProxyEndpoint>

NOTA: Las RouteRules se evalúan en el orden especificado en la configuración de ProxyEnpoint. Siempre debe tener la ruta predeterminada (sin condición) al final. De lo contrario, si está en la parte superior, siempre coincidirá y nunca evaluará las otras posibilidades de ruta.