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 = ""
|
|
|
|
|
2022-01-31 12:02:35 +00:00
|
|
|
APIProxyRequest = {
|
2022-01-31 14:50:59 +00:00
|
|
|
"Name": None,
|
|
|
|
"Method": None,
|
|
|
|
"Url": None,
|
|
|
|
"Header": None,
|
|
|
|
"Body": None,
|
|
|
|
"Readonly": None
|
2022-01-31 12:02:35 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
APIProxyResponse = {
|
2022-01-31 14:50:59 +00:00
|
|
|
"Status": None,
|
|
|
|
"StatusCode": None,
|
|
|
|
"Header": None,
|
|
|
|
"Body": None
|
2022-01-31 12:02:35 +00:00
|
|
|
}
|
|
|
|
|
2022-01-20 15:16:13 +00:00
|
|
|
def __init__ (self):
|
2022-02-17 12:52:34 +00:00
|
|
|
self.ep = os.environ.get("REPLAY_ADDR")
|
2022-01-20 15:16:13 +00:00
|
|
|
|
|
|
|
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-31 11:54:33 +00:00
|
|
|
if res.status_code >= 400:
|
|
|
|
raise Exception(f"HTTP ERROR: {str(res.status_code)} - {res.text}")
|
2022-01-21 13:58:45 +00:00
|
|
|
|
2022-01-31 15:08:18 +00:00
|
|
|
|
|
|
|
return json.loads(res.text)
|
2022-01-31 11:54:33 +00:00
|
|
|
|
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:
|
2022-01-31 14:50:59 +00:00
|
|
|
- request: Estrutura APIProxyRequest definida nesta mesma classe. Instancie-a e altere os valores das chaves de acordo com sua necessidade, veja abaixo como:
|
2022-01-20 15:16:13 +00:00
|
|
|
|
|
|
|
{
|
|
|
|
"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:
|
2022-01-31 14:50:59 +00:00
|
|
|
-> Estrutura APIProxyResponse já definida nesta classe.
|
2022-01-20 15:16:13 +00:00
|
|
|
"""
|
|
|
|
|
2022-01-31 15:08:18 +00:00
|
|
|
do_response = self.__request_json_post__ ("/ipc/apiproxy/do", request)
|
|
|
|
|
|
|
|
do_response["body"] = base64.b64decode(do_response["body"])
|
|
|
|
do_response["body"] = str(do_response["body"], "utf-8")
|
2022-01-20 15:16:13 +00:00
|
|
|
|
2022-01-31 15:08:18 +00:00
|
|
|
if do_response["header"]["Content-Type"].find("json") != -1:
|
|
|
|
do_response["body"] = json.loads(do_response["body"])
|
|
|
|
|
|
|
|
return do_response
|