From 6a3720190fd82db4c87e7eecff94a784fb9f65fb Mon Sep 17 00:00:00 2001 From: Pedro de Oliveira Guedes Date: Thu, 20 Jan 2022 12:16:13 -0300 Subject: [PATCH] Developing the API Proxy client. --- api/apiproxy/cli.py | 82 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/api/apiproxy/cli.py b/api/apiproxy/cli.py index e69de29..ae9052f 100644 --- a/api/apiproxy/cli.py +++ b/api/apiproxy/cli.py @@ -0,0 +1,82 @@ +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) + + if res.status_code >= 400: + raise Exception(f"HTTP ERROR: {str(res.status_code)} - {res.text}") + if res.headers.get("Content-Type") != None and res.headers.get("Content-Type").find("json") != -1: + return json.loads(res.text) + else: + return res.text + + 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) +