replaycli-py/api/apiproxy/cli.py

90 lines
3.1 KiB
Python
Raw Permalink Normal View History

2022-01-21 13:58:45 +00:00
import base64
2022-01-20 15:16:13 +00:00
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)
2022-01-21 13:58:45 +00:00
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)
2022-01-20 15:16:13 +00:00
else:
2022-01-21 13:58:45 +00:00
return decoded_body
2022-01-20 15:16:13 +00:00
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)