¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Cómo resolver el problema de Control de Acceso de Origen Cruzado al acceder a un Servicio RESTful desde una aplicación JavaScript

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 4 Vistas
0
Cargando...

Hola Expertos,
Estoy intentando acceder a un Servicio RESTful (creado en SICF, implementación escrita en la clase Handler) desde una aplicación JavaScript.
Ahora, me encuentro con el problema de Control de Acceso de Origen Cruzado.
Después de horas de investigación, descubrí que hay dos formas de resolver esto:
a) JSONP
b) CORS

a) JSONP:
Ahora, utilicé JSONP con una función de devolución de llamada y está llamando al Controlador REST de SAP y configurando la respuesta en JSON (usé la Clase CL_FDT_JSON para convertir de ABAP a JSON). Sin embargo, la llamada AJAX va a la sección de error dando "Error de análisis" en las herramientas de desarrollo del navegador.
Creo que SAP no es compatible con JSONP y por eso no estoy obteniendo el resultado exitoso (POR FAVOR, CORRÍJANME SI ESTOY EQUIVOCADO)


Aquí está el código,
<script type = "text/javascript" src = <a class="jive-link-external-small" href="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js" rel="nofollow noopener noreferrer">https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js</a> ></script>

b) CORS
Ahora, la segunda opción fue usar CORS.
Agregué el parámetro de encabezado al enviar la respuesta desde la Clase Handler
server->response->set_header_field( Exporting name = 'Access-Control-Allow-Origin'

value = '*' )

Ahora, el código modificado para esta parte es

function submitForm2() {

En este caso, el Servidor SAP ni siquiera está siendo llamado y obtengo un error 401 no autorizado y aparece un error de Control de Acceso de Origen Permitido desde el principio.

Nota:
Puedo desactivar la Seguridad Web para hacer que funcione, pero es para una implementación práctica.

Disculpas por el extenso mensaje, pero estoy volviéndome loco y no puedo solucionarlo.

Gracias
Sahil

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Hola Antiguo Miembro,
Tienes razón. Mi confusión era El JSON válido es lo mismo que el JSONP válido, que no lo es. La razón por la que no estaba recibiendo la Llamada Exitosa es porque estaba enviando una estructura JSON válida en lugar de una estructura JSONP.
Una estructura JSONP válida se vería así: callbackMethod( {JSON} ).
Así que envolví manualmente el JSON de mi servidor usando el método de llamada de vuelta y funcionó.

$.ajax({

type: "GET",

url: url,

dataType: "jsonp",

jsonp: false,

jsonpCallback: "myJsonMethod",

success: function (data) {

console.log(data);

},

error: function (httpReq, status, exception) {

alert(status + " " + exception);

}

});


Aquí, agregué myJsonMethod( ) en la Clase de Controlador a la Salida JSON para que funcione.

Por último, la buena noticia es que podemos hacer tanto CORS como JSON con SAP. ¡Eso es increíble!

Gracias
Sahil

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Sourav,

¡Qué bueno saber que mi blog te fue útil!

Así que encontraste una solución alternativa para el problema de CORS, de acuerdo. Creo que el navegador envía automáticamente una solicitud de pre-vuelo con OPTIONS como verbo HTTP, básicamente para evaluar la respuesta de Access-Control-Allow-Origin, y esta solicitud de pre-vuelo por defecto debe ser atendida sin autenticación. Pero parece que encontraste una forma de realizar este paso de pre-vuelo con autenticación también.

En cuanto a JSONP: todavía no te creo. Si colocas una cadena de bytes UTF8 en el cuerpo de la respuesta HTTP con server->response->set_data( ... ), aparecerá precisamente en esa forma en el cliente. Por favor, muéstrame un ejemplo donde esto no sea así. El resto de JSONP solo depende de si tu controlador codifica correctamente la convención. La cadena de respuesta debe ser un código JavaScript válido de la forma "handler( ... )", donde el nombre handler es arbitrario y debe tomarse de un parámetro para desacoplar el servidor del cliente (la libertad de cambiar el nombre de la función queda a discreción del cliente, sin necesidad de cambiar en el servidor), y el ... contiene los parámetros reales de esta llamada a la función, generalmente en forma de datos JSON.

Saludos,

Rüdiger

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Ex Miembro,
Muchas gracias por tomarte el tiempo de responder. No puedes imaginar lo mucho que tu publicación sobre la creación de Servicios Rest en ABAP ayudó a nuestro equipo y nos hizo más eficientes.

En cuanto al problema, lo solucioné a través de CORS al enviar xhr:withCredentials como true en mi solicitud AJAX y añadiendo Access-Control-Allow-Credentials como TRUE y Access-Control-Allow-Origin al host que estaba llamando en el manejador SICF.

Sin embargo, hablando sobre JSONP, el depurador llega al manejador y la respuesta se escribe en el servidor. Pero, la función de éxito en el lado del cliente devuelve Null, y estoy recibiendo los datos de respuesta en una URI extendida: http:/XXXX:8000/sap/bc/zrest_demo?sap-client=200&callback=jQuery1620229378700197‌​5638_1466390509710&_=1466390513676


Según JSONP, los resultados deberían ser devueltos en una función de devolución de llamada, pero en el caso de SAP como servidor, se almacenan en una función intermedia pero no se transfieren completamente a la solicitud.

Cualquier sugerencia/ejemplo sobre cómo usar JSONP con SAP sería genial.

Gracias
Sourav

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Sahil Shah,

La afirmación "ABAP no admite JSONP" no tiene sentido. ABAP admite cualquier cosa que desees tener en la carga de respuesta. Puedes enviar cualquier dato en cualquier forma en tu manejador de solicitud HTTP: todo depende de tu implementación del manejador de solicitud HTTP.

JSONP simplemente significa que debes programar tu manejador de solicitud de manera que envuelva su respuesta normal '...' en una cadena 'handle( ... )', donde 'handle' es un nombre de identificador que se pasa como parámetro de solicitud al servicio y debe ser eco como se describe en la respuesta.

Tu segundo problema, HTTP 401 No autorizado, apunta a un problema diferente. ¿Estás al tanto de las "solicitudes de preconfiguración" con el verbo OPTIONS que se envía por adelantado en lugar de "GET" o "POST" y no requiere Datos de Autenticación (en lugar de la solicitud "real" GET que se envía posteriormente y que requiere los Datos de Autenticación)? Consulta javascript - 401 when trying to implement CORS for SharePoint - Stack Overflow para obtener una introducción a este problema CORS general.

Saludos,

Rüdiger

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?