¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Como resolver o problema de Controle de Acesso de Origem Cruzada ao acessar um Serviço RESTful de uma aplicação JavaScript

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

Olá Especialistas,
Estou tentando acessar um Serviço RESTful (criado no SICF, implementação escrita na classe Handler) de uma aplicação JavaScript.
Agora, estou enfrentando o problema de Controle de Acesso de Origem Cruzada.
Depois de horas de pesquisa, descobri que existem duas maneiras de resolver isso:
a) JSONP
b) CORS

a) JSONP:
Agora, utilizei JSONP com uma função de callback e está chamando o Controlador REST do SAP e configurando a resposta em JSON (utilizei a Classe CL_FDT_JSON para converter de ABAP para JSON). No entanto, a chamada AJAX está indo para a seção de erro, exibindo "Erro de análise" nas ferramentas de desenvolvimento do navegador.
Acredito que o SAP não seja compatível com JSONP e por isso não estou obtendo o resultado desejado (POR FAVOR, CORRIJA-ME SE ESTIVER ERRADO)


Aqui está o 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
Agora, a segunda opção foi usar CORS.
Adicionei o cabeçalho ao enviar a resposta da Classe Handler
server->response->set_header_field( Exporting name = 'Access-Control-Allow-Origin'

value = '*' )

Agora, o código modificado para esta parte é

function submitForm2() {

Neste caso, o Servidor SAP nem mesmo está sendo chamado e recebo um erro 401 não autorizado e um erro de Controle de Acesso de Origem Permitido desde o início.

Nota:
Posso desativar a Segurança Web para fazer funcionar, mas é para uma implementação prática.

Desculpas pela mensagem extensa, mas estou ficando louco e não consigo resolver.

Obrigado
Sahil

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

4 Respuestas

0
Cargando...

Olá Antigo Membro,
Você está correto. Minha confusão era O JSON válido é diferente do JSONP válido. A razão pela qual não estava recebendo a Chamada Bem-Sucedida é porque estava enviando uma estrutura JSON válida em vez de uma estrutura JSONP.
Uma estrutura JSONP válida seria assim: callbackMethod( {JSON} ).
Então, manualmente envolvi o JSON do meu servidor usando o método de chamada de retorno e funcionou.

$.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);

}

});


Aqui, adicionei myJsonMethod( ) na Classe de Controlador à Saída JSON para que funcione.

Por fim, a boa notícia é que podemos fazer tanto CORS quanto JSON com SAP. Isso é incrível!

Obrigado
Sahil

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

Olá Sourav,

Que bom saber que meu blog foi útil para você!

Então você encontrou uma solução alternativa para o problema de CORS, legal. Acredito que o navegador envia automaticamente uma solicitação de pre-voo com OPTIONS como verbo HTTP, basicamente para avaliar a resposta de Access-Control-Allow-Origin, e essa solicitação de pre-voo por padrão deve ser tratada sem autenticação. Mas parece que você encontrou uma maneira de realizar essa etapa de pre-voo com autenticação também.

Quanto ao JSONP: ainda não estou convencido. Se você colocar uma string de bytes UTF8 no corpo da resposta HTTP com server->response->set_data( ... ), ela aparecerá exatamente da mesma forma no cliente. Por favor, me mostre um exemplo onde isso não seja verdade. O restante do JSONP depende apenas se o seu controlador codifica corretamente a convenção. A resposta da string deve ser um código JavaScript válido no formato "handler( ... )", onde o nome handler é arbitrário e deve ser retirado de um parâmetro para desvincular o servidor do cliente (a liberdade de alterar o nome da função fica a critério do cliente, sem a necessidade de alterar no servidor), e o ... contém os parâmetros reais desta chamada de função, geralmente na forma de dados JSON.

Saudações,

Rüdiger

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

Olá Ex-Membro,
Muito obrigado por tirar um tempo para responder. Você não pode imaginar o quanto sua postagem sobre a criação de Serviços Rest em ABAP ajudou nossa equipe e nos tornou mais eficientes.

Em relação ao problema, eu o resolvi através do CORS ao enviar xhr:withCredentials como true em minha solicitação AJAX e adicionando Access-Control-Allow-Credentials como TRUE e Access-Control-Allow-Origin ao host que estava sendo chamado no manipulador SICF.

No entanto, falando sobre JSONP, o depurador chega ao manipulador e a resposta é escrita no servidor. Porém, a função de sucesso no lado do cliente retorna Null, e estou recebendo os dados de resposta em uma URI estendida: http:/XXXX:8000/sap/bc/zrest_demo?sap-client=200&callback=jQuery1620229378700197?5638_1466390509710&_=1466390513676


Segundo o JSONP, os resultados deveriam ser retornados em uma função de retorno de chamada, mas no caso do SAP como servidor, eles são armazenados em uma função intermediária mas não são totalmente transferidos para a solicitação.

Qualquer sugestão/exemplo sobre como usar JSONP com o SAP seria ótimo.

Obrigado
Sourav

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

Olá Sahil Shah,

A afirmação "ABAP não suporta JSONP" não faz sentido. ABAP suporta qualquer coisa que você queira ter na carga de resposta. Você pode enviar qualquer dado de qualquer forma em seu manipulador de solicitação HTTP: tudo depende da sua implementação do manipulador de solicitação HTTP.

JSONP simplesmente significa que você deve programar seu manipulador de solicitação para envolver sua resposta normal '...' em uma string 'handle( ... )', onde 'handle' é um nome de identificador passado como parâmetro de solicitação para o serviço e deve ser ecoado conforme descrito na resposta.

Seu segundo problema, HTTP 401 Não Autorizado, aponta para um problema diferente. Você está ciente das "solicitações de pré-configuração" com o verbo OPTIONS que são enviadas antecipadamente em vez de "GET" ou "POST" e não requerem Dados de Autenticação (em vez da solicitação "real" GET que é enviada posteriormente e que sim requer os Dados de Autenticação)? Consulte javascript - 401 when trying to implement CORS for SharePoint - Stack Overflow para obter uma introdução a este problema CORS em geral.

Saudações,

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?