import base64 import json import os import requests class API_Proxy: """ ## API Proxy --- O Serviço API Proxy permite realizar chamadas a api externas proxiadas pelo Replay. Dessa forma, as chamadas podem ficar pré- configuradas dentro do Replay. Caso o robô ou aplicação desejem alterar algum parâmetro antes da chamada ainda é possível, para isso, deve-se modificar a estrutura da requisição. Para entender melhor a como funciona a estrutura de requisição, você pode visitar a documentaçao oficial ou dar uma olhada no método "do ()" deste client. """ ep: str = "" def __init__ (self): self.ep = "https://localhost:8443" def __request_json_post__(self, path: str, object: dict): """ ## HTTP JSON POST --- Este método é responsável por realizar requisições HTTP do tipo POST para objetos JSON. Ele retorna o corpo de resposta da requisição, ou uma mensagem de erro, que indica qual foi a irregularidade ocorrida ao chamar a API. """ url = self.ep + path print("Calling: " + url) apikey = os.environ.get('REPLAY_APIKEY') headers = {"X-API-KEY": apikey} res = requests.post(url, json = object, headers = headers, verify = False) response = json.loads(res.text) byte_encoded_body = base64.b64decode(response['body']) decoded_body = str(byte_encoded_body, "utf-8") if response['status_code'] >= 400: raise Exception(f"HTTP ERROR: {str(response['status_code'])} - {response['body']}") if response['header']['Content-Type'] != None and response['header']['Content-Type'].find('json') != -1: return json.loads(decoded_body) else: return decoded_body def do (self, request: dict): """ ## API Proxy Do Faz o proxy da chamada remota e retorna qualquer que seja o resultado desta requisição. --- #### Parâmetros: - request: Estrutura específica da requisição. Veja abaixo como construí-la: { "Name": "Nome de template da chamada", "Method": "Método de requisição (GET, POST, PUT, ...)", "Url": "Url da API que se deseja chamar", "Header": { "Chave da configuração de cabeçalho": "Valor associado", ... }, "Body": "Elementos pertencentes ao corpo da requisição", "Readonly": - True: Mesmo que seja encontrado um template correspondente ao valor de "Name" passado, as configurações desta estrutura prevalecerão na requisição. - False: Caso um template seja encontrado em correspondência ao valor passado em "Name", as configurações do mesmo sobrescreverão as informações passadas nesta estrutura. } --- #### Retorna: -> Resultado da requisição """ return self.__request_json_post__ ("/ipc/apiproxy/do", request)