Changing the do method return interface. Now, instead of returning only the response body, it returns the entire response.
107 lines
3.5 KiB
Python
107 lines
3.5 KiB
Python
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 = ""
|
|
|
|
APIProxyRequest = {
|
|
"Name": None,
|
|
"Method": None,
|
|
"Url": None,
|
|
"Header": None,
|
|
"Body": None,
|
|
"Readonly": None
|
|
}
|
|
|
|
APIProxyResponse = {
|
|
"Status": None,
|
|
"StatusCode": None,
|
|
"Header": None,
|
|
"Body": None
|
|
}
|
|
|
|
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}")
|
|
|
|
|
|
return json.loads(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 APIProxyRequest definida nesta mesma classe. Instancie-a e altere os valores das chaves de acordo com sua necessidade, veja abaixo como:
|
|
|
|
{
|
|
"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:
|
|
-> Estrutura APIProxyResponse já definida nesta classe.
|
|
"""
|
|
|
|
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")
|
|
|
|
if do_response["header"]["Content-Type"].find("json") != -1:
|
|
do_response["body"] = json.loads(do_response["body"])
|
|
|
|
return do_response
|