Introdução
APEX_WEB_SERVICE é de longe minha API APEX Pl/SQL favorita. Reduz drasticamente o esforço de chamar serviços Web externos do banco de dados Oracle. Nesta postagem, abordarei primeiro os principais conceitos que você precisa saber e, em seguida, revisarei vários casos de uso em que usei APEX_WEB_SERVICE para tornar minha vida mais fácil.
Cabeçalhos HTTP
Ao lidar com APIs REST, existem duas maneiras principais de passar informações adicionais para a API REST. Isso ocorre por meio de cabeçalhos HTTP e parâmetros de string de consulta.
Normalmente você usa cabeçalhos HTTP para transmitir informações a uma API REST. No exemplo abaixo, estou solicitando a utilização da versão 2.1 da API. Nota : Cabeçalhos HTTP também são usados para passar tokens de autorização, mas APEX_WEB_SERVICE cuida disso para você (mais sobre isso mais tarde).
Limpando cabeçalhos HTTP existentes
É sempre uma boa ideia usar
apex_web_service.clear_request_headers
para limpar quaisquer cabeçalhos HTTP existentes. Isso é importante se você ainda tiver cabeçalhos definidos de uma chamada anterior para apex_web_service.Você também pode passar
TRUE
para o booleanop_reset
toapex_web_service.set_request_headers
e ele limpará todos os cabeçalhos existentes.
- Você pode passar até cinco cabeçalhos de solicitação para apex_web_service.set_request_headers.
Parâmetros de string de consulta
Parâmetros de string de consulta normalmente são usados para passar parâmetros para a API REST que você chama. Quando visualizados em uma URL de solicitação REST, eles são vistos como um '?' marca seguida por uma lista delimitada por '&' de pares 'parâmetro=valor'.
APEX_WEB_SERVICE
os parâmetros p_parm_name
e p_parm_value
(exemplos a seguir).
Tratamento de tempos limite
Ao chamar APIs remotas, nunca podemos ter certeza de quanto tempo elas levarão para responder. Às vezes, precisamos esperar mais tempo para que as solicitações sejam concluídas ou encurtar o período de espera para que possamos falhar mais rapidamente.
APEX_WEB_SERVICE
lida com tempos limite por meio do p_transfer_timeout
parâmetro. Você pode alterar o tempo limite padrão (180 segundos) passando um número de segundos para este parâmetro.
Listas de controle de acesso (ACLs)
Você não irá longe até criar uma ACL para permitir que o APEX faça solicitações de saída para o serviço Web que você está tentando chamar. ACLs são a forma do Oracle Database limitar quais usuários podem fazer chamadas para quais endpoints. Ao criar a ACL, você precisa especificar o esquema APEX atual como principal_name, por exemplo, o principal_name seria APEX_230200
para APEX 23.2.
Certificados TLS/SSL
Quase todos os serviços da web possuem HTTPS
terminais. Isso significa que APEX_WEB_SERVICE deve repassar um certificado público e a solicitação ao Web Service. O banco de dados Oracle lida com isso armazenando esses certificados em uma carteira TLS de banco de dados. As carteiras TLS são criadas no sistema de arquivos do servidor de banco de dados.
Criando uma carteira TLS de banco de dados
Você precisa obter o certificado antes de criar a carteira DB TLS. A maneira mais fácil de obter o certificado para um serviço web é chamá-lo em seu navegador, visualizá-lo e exportar o certificado raiz para um arquivo '.cer'.
Referenciando uma carteira DB TLS do APEX
A maneira mais fácil de fazer referência a uma carteira TLS de banco de dados no APEX é configurá-la em Serviços de Administração (o espaço de trabalho INTERNO).
APEX_WEB_SERVICE usará a carteira TLS configurada aqui, a menos que você informe o contrário. Você pode substituir o padrão passando o parâmetro p_wallet_path
para APEX_WEB_SERVICE. Se a carteira tiver uma senha (que não é necessária), você poderá passá-la com o parâmetro p_wallet_pwd
.
OBS: Se você usa o Oracle OCI Autonomous ou APEX Services, não precisa se preocupar em criar uma carteira TLS de banco de dados. A Oracle cria uma carteira TLS para você e a preenche com quase todos os certificados SSL/TLS disponíveis.
Proxy de encaminhamento
Uma alternativa para uma carteira de banco de dados é usar um servidor proxy. Com essa abordagem, você chama um terminal HTTP e o proxy de encaminhamento passa a solicitação para o terminal final por HTTPS.
APEX_WEB_SERVICE permite especificar um proxy usando o parâmetro p_proxy_override
.
Serviços Web Seguros
A maioria dos serviços da web são seguros e exigem que você passe algumas credenciais para autenticar sua solicitação. APEX_WEB_SERVICE facilita o tratamento de credenciais. No centro dessa facilidade de uso estão as credenciais da Web APEX . As credenciais da Web APEX oferecem uma maneira de armazenar suas credenciais com segurança, facilitando o consumo de serviços APEX como APEX_WEB_SERVICE. As credenciais da Web APEX suportam os seguintes tipos de credenciais:
Autenticação Básica - Envia nome de usuário e senha no formato codificado em Base64 como o cabeçalho da solicitação de autorização.
Credenciais do cliente OAuth2 - O Oracle APEX troca o ID do cliente e o segredo do cliente por um token de acesso usando uma URL de servidor de token. O token de acesso é então usado para executar a solicitação real. Se o token de acesso expirar, o Oracle APEX solicitará um novo de forma transparente.
Autenticação Nativa OCI - O Oracle APEX assina solicitações para a API REST do Oracle Cloud Infrastructure (OCI), conforme descrito na Documentação do OCI.
Cabeçalho HTTP – A credencial é adicionada à solicitação REST como um cabeçalho HTTP. O nome da credencial é usado como nome do cabeçalho e o segredo da credencial é usado como valor do cabeçalho.
String de consulta de URL – A credencial é adicionada à URL da solicitação REST como um parâmetro de string de consulta (por exemplo: ?name=value).
Par de chaves - Uma credencial de par de chaves consiste em uma chave pública, compartilhada abertamente para criptografar dados, e uma chave privada, mantida em segredo com segurança para descriptografar dados, garantindo uma troca segura de dados.
Para utilizar uma credencial da Web APEX em sua chamada de serviço da Web, você precisa fazer referência ao ID estático da credencial da Web no p_credential_static_id
parâmetro (veja os exemplos abaixo).
Funcionou?
Depois de chamar um serviço da web usando APEX_WEB_SERVICE, você precisará confirmar se funcionou. No mundo das APIs REST, isso é feito verificando o código de status da resposta HTTP. Embora existam diretrizes sobre o significado de cada código de resposta, você precisa entender os códigos de resposta de cada API chamada. Um código de resposta por si só não diz tudo. Algumas APIs podem retornar uma 500
resposta e fornecer detalhes do erro na carga útil da resposta.
Para obter o código de resposta de uma chamada para APEX_WEB_SERVICE, você deve verificar o pacote PL/SQL global apex_web_service.g_status_code
.
Método HTTP
Ao chamar serviços da web, você deve especificar um método HTTP. Os métodos HTTP possíveis são HTTP GET, POST, PUT, DELETE e PATCH. Ao usar APEX_WEB_SERVICE, você seleciona o método usando o p_http_method
parâmetro. O padrão APEX_WEB_SERVICE é o método GET se você não o fornecer explicitamente.
OBS: É uma boa prática sempre especificar um valor para p_http_method. Isso deixa as coisas claras para o próximo desenvolvedor que visualizar seu código.
Exploração madeireira
Todas as chamadas para a APEX_WEB_SERVICE
API são registradas na tabela apex_webservice_log
. Você pode visualizar os logs clicando em Monitorar atividade > Log de atividades de serviço da Web no APEX Builder.
Máximo de solicitações para um espaço de trabalho
Depois de configurar um novo ambiente APEX e começar a fazer muitas chamadas para APEX_WEB_SERVICE, muitas pessoas recebem a mensagem de erro " ORA-20001: Você excedeu o número máximo de solicitações de serviços web por espaço de trabalho".
Isso ocorre porque, por padrão, o APEX está configurado para permitir apenas 1.000 solicitações de serviços da Web em um período de 24 (janela contínua).
Você pode alterar isso no nível do espaço de trabalho ou no espaço de trabalho INTERNO (serviços de administração) para alterá-lo para toda a instância. A configuração do valor no nível da área de trabalho substitui o valor definido no nível INTERNO (Serviços de Administração).
OBS: Se ainda não o fez, aconselho que altere o padrão INTERNO (Serviços de Administração) o mais rápido possível.
Nível de Serviços Internos/Administrativos
Faça login no espaço de trabalho INTERNO (Serviços de Administração) e clique em Gerenciar instância > Segurança > Isolamento do espaço de trabalho > 'Máximo de solicitações de serviço da Web'.
Nível do espaço de trabalho
Faça login no espaço de trabalho INTERNO (Serviços de Administração) e clique em Gerenciar Espaços de Trabalho > Espaços de Trabalho Existentes > Editar Informações do Espaço de Trabalho > Isolamento do Espaço de Trabalho.
OBS: A opção de substituição do espaço de trabalho não está disponível para os serviços OCI ATP ou APEX.
Definir via API
Dica bônus: você também pode definir o máximo de solicitações de serviço da Web para um espaço de trabalho usando a apex_instance_adminAPI PL/SQL.
Cabeçalhos de resposta
O conceito final que precisamos abordar são os cabeçalhos de resposta. Os serviços da Web geralmente incluem cabeçalhos HTTP na resposta, fornecendo informações adicionais, como eTag e informações de tipo de conteúdo . Depois de chamar APEX_WEB_SERVICE, o APEX preenche um array PL/SQL chamado apex_web_service.g_headers contendo uma lista de cabeçalhos HTTP de resposta.
Casos de uso
Agora que cobrimos os conceitos, vamos examinar os exemplos. Esta seção revisará vários exemplos de chamada de APIs REST usando APEX_WEB_SERVICE. Esses exemplos se concentrarão em apex_web_service.make_rest_request e apex_web_service.make_rest_requestb.
Chamada simples de API REST
Na sua forma mais simples, você pode ligar apex_web_service.make_rest_requestda seguinte maneira. Esta API REST específica não requer autenticação.
A instrução CURL equivalente é semelhante a esta:
Autenticação Básica
Esta solicitação chama um serviço web que possui autenticação básica (nome de usuário e senha):
Authorization: Basic bmxvaXRlcnRvbjg6SFRReHhYVjlCcTQ=
.A instrução CURL equivalente é semelhante a esta:
Credenciais do cliente OAuth2
Esta solicitação chama uma API do Microsoft Graph para obter uma lista de sites do SharePoint para o locatário do Microsoft Office 365.
p_transfer_timeout
faz com que a solicitação atinja o tempo limite se não for concluída em 10 segundos.p_token_url
informa ao apex_web_service o URL a ser usado ao trocar o ID do cliente OAuth2 e o segredo do cliente por um token.
p_credential_static_id
informa ao APEX qual credencial Web APEX usar ao realizar a troca de tokens de credenciais do cliente OAuth2.
O CURL para a busca do token OAuth2 que o APEX cuida para uso nos bastidores é assim:
O CURL para chamar a API MS Graph usando o token é semelhante a este:
A credencial da Web para o exemplo acima é semelhante a esta:
Chamada multiparte
APEX_WEB_SERVICE oferece suporte a chamadas de API multiparte desde o APEX 20.2. Aqui está um exemplo de uma solicitação com várias partes.
- No exemplo acima, estou usando um método alternativo para definir o token OAuth chamando apex_web_service.oauth_set_token.
Buscando um BLOB
Freqüentemente, você precisa buscar mídia, em vez de JSON ou XML. Neste exemplo, estou buscando um arquivo do SharePoint.
OBS: APEX_WEB_SERVICE torna a busca de um arquivo do SharePoint muito fácil. Depois de definir uma credencial da Web, precisamos de apenas três linhas de código para buscar um arquivo.
Obtenha um feed de blog XML Atom
Podemos alcançar grandes resultados se combinarmos APEX_WEB_SERVICE com outros recursos do banco de dados Oracle. Digamos que queremos consultar as últimas cinco postagens do feed do blog de Jeff Smith. As postagens do blog de Jeff estão disponíveis por meio de um feed RSS baseado em XML, acessível usando o URL https://www.thatjeffsmith.com/feed/atom . Não há segurança; você pode copiar e colar o URL acima em seu navegador e ver o feed.
Podemos transformar esse feed em linhas e colunas que podemos consumir no APEX usando o seguinte SQL:
Olhando profundamente na cláusula FROM, você pode ver que estamos chamando apex_web_service.make_rest_request. Isso retorna o XML do feed para a função XMLTYPE, que converte o texto XML em um objeto XML.
Assim que tivermos um objeto XMLTYPE, podemos passá-lo para XMLTABLE, que mapeia o XML em linhas e colunas.
Neste ponto, você precisa fazer referência aos campos do feed que deseja expor na consulta SQL.
Nenhum comentário:
Postar um comentário