HIRO 7 图形 REST API 的 Hiro 客户端
项目描述
HIRO 图形 API 客户端
这是一个用于访问HIRO Graph数据的客户端库。
该库还包含用于处理WebSocket event-ws
和action-ws
API 的类。
要处理大量数据,请查看“hiro-batch-client”。-(PyPI:hiro-batch-client,GitHub:hiro-batch-client-python)
有关 HIRO 自动化的更多信息,请查看https://www.arago.co/
有关此库涵盖的 API 的更多信息,请参阅https://developer.hiro.arago.co/7.0/api/
目前,实施的是
HiroApp
为了app
HiroAuth
为了auth
HiroGraph
为了graph
HiroIam
为了iam
HiroKi
为了ki
HiroAuthz
为了authz
HiroVariables
为了variables
对于 websockets
AbstractEventWebSocketHandler
为了event-ws
AbstractActionWebSocketHandler
为了action-ws
快速开始
要使用此库,您需要在https://id.arago.co/上拥有一个帐户并访问 OAuth Client-Id 和 Client-Secret 以访问 HIRO Graph。另请参阅https://developer.hiro.arago.co。
大多数文档都是在源代码中完成的。
HiroGraph 示例
使用简单图形 api 客户端的示例:
from hiro_graph_client import PasswordAuthTokenApiHandler, HiroGraph
hiro_client: HiroGraph = HiroGraph(
api_handler=PasswordAuthTokenApiHandler(
root_url="https://core.arago.co",
username='',
password='',
client_id='',
client_secret=''
)
)
# The commands of the Graph API are methods of the class HIROGraph.
# The next line executes a vertex query for instance.
query_result = hiro_client.query('ogit\\/_type:"ogit/MARS/Machine"')
print(query_result)
TokenApiHandler
对 HIRO Graph 的授权是通过令牌完成的。AbstractTokenApiHandler
这些标记由该库中的类型类处理。每个 Hiro-Client-Object ( HiroGraph
, HiroApp
, 等) 在构造时都需要某种 TokenApiHandler。
此 TokenApiHandler 还负责确定 API 调用的最新端点。custom_endpoints=
您可以在构造时使用 dict 参数提供自定义的端点列表。
也可以通过headers=
构造函数中的 dict 参数设置自定义的标题列表。这些将更新内部标题。标题名称可以以任何大写/小写形式提供。
该库提供以下 TokenApiHandlers:
FixedTokenApiHandler
在构造时使用预设令牌生成的简单 TokenApiHandler。无法更新其令牌。
EnvironmentTokenApiHandler
从运行时环境中读取环境变量(默认为HIRO_TOKEN
)的 TokenApiHandler。仅当环境变量在外部发生更改时才会更新其令牌。
PasswordAuthTokenApiHandler
此 TokenApiHandler 登录到 HiroAuth 后端并从登录凭据中获取令牌。这也是唯一一个 TokenApiHandler(到目前为止)在过期时自动尝试从后端更新令牌。
本文档中的所有代码示例都可以互换使用这些 TokenApiHandler,具体取决于提供此类令牌的方式。
上面的 HiroGraph 示例与另一个自定义的 TokenApiHandler:
from hiro_graph_client import EnvironmentTokenApiHandler, HiroGraph
hiro_client: HiroGraph = HiroGraph(
api_handler=EnvironmentTokenApiHandler(
root_url="https://core.arago.co"
)
)
# The commands of the Graph API are methods of the class HIROGraph.
# The next line executes a vertex query for instance.
query_result = hiro_client.query('ogit\\/_type:"ogit/MARS/Machine"')
print(query_result)
带有附加参数的示例:
from hiro_graph_client import EnvironmentTokenApiHandler, HiroGraph
hiro_client: HiroGraph = HiroGraph(
api_handler=EnvironmentTokenApiHandler(
root_url="https://core.arago.co",
env_var='_TOKEN',
headers={
'X-Custom-Header': 'My custom value'
},
custom_endpoints={
"graph": "/api/graph/7.2",
"auth": "/api/auth/6.2"
},
client_name="HiroGraph (testing)" # Will be used in the header 'User-Agent'
)
)
# The commands of the Graph API are methods of the class HIROGraph.
# The next line executes a vertex query for instance.
query_result = hiro_client.query('ogit\\/_type:"ogit/MARS/Machine"')
print(query_result)
令牌处理程序共享
当您需要访问 HIRO 的多个 API 时,请在 API 对象之间共享 TokenApiHandler,以避免对 HIRO 进行不必要的令牌和版本信息请求。TokenApiHandler 将requests.Session
在它们之间共享令牌和版本请求处理以及令牌字符串本身。
from hiro_graph_client import HiroGraph, HiroApp, PasswordAuthTokenApiHandler
hiro_api_handler = PasswordAuthTokenApiHandler(
root_url="https://core.arago.co",
username='',
password='',
client_id='',
client_secret=''
)
hiro_client: HiroGraph = HiroGraph(
api_handler=hiro_api_handler
)
hiro_app_client: HiroApp = HiroApp(
api_handler=hiro_api_handler
)
连接共享
您还可以让 TokenApiHandler 共享一个公共连接会话,而不是让它们每个人创建自己的。这在令牌必须在外部设置或经常更改(即每个线程每个用户一个令牌)的多线程环境中可能证明是有用的。这也确保了版本请求仅在连接初始化时发生一次。
使用参数pool_maxsize
和pool_block
进一步调整连接参数以并行访问后端。请参阅请求会话对象requests.adapters.HTTPAdapter
以及和
的 Python 文档GraphConnectionHandler
。
from hiro_graph_client import HiroGraph, HiroApp, FixedTokenApiHandler, GraphConnectionHandler
connection_handler = GraphConnectionHandler(
root_url="https://core.arago.co",
pool_maxsize=200, # Optional: Max pool of cached connections for this connection session
pool_block=True, # Optional: Do not allow more parallel connections than pool_maxsize
client_name="Your Graph Client 0.0.1" # Optional: Will be used in the header 'User-Agent'
)
# Work with token of user 1
user1_client: HiroGraph = HiroGraph(
api_handler=FixedTokenApiHandler(
connection_handler=connection_handler,
token='token user 1'
)
)
# Work with token of user 2 (Shared Token Handler)
user2_api_handler = FixedTokenApiHandler(
connection_handler=connection_handler,
token='token user 2'
)
user2_client: HiroGraph = HiroGraph(
api_handler=user2_api_handler
)
hiro_app_client: HiroApp = HiroApp(
api_handler=user2_api_handler
)
Token Handler Sharing中编写的所有内容仍然适用。
SSL 配置
SSL 参数是使用类配置的SSLConfig
。此类将给定的参数转换为requests
Python 库的必需字段(参数cert
和verify
那里)。此配置提供给 TokenApiHandlers,并且也将由附加到它的客户端使用。
如果未设置,requests
将使用库的默认设置,即使用系统默认值验证任何服务器证书。
示例:禁用验证
from hiro_graph_client import EnvironmentTokenApiHandler, HiroGraph, SSLConfig
hiro_client: HiroGraph = HiroGraph(
api_handler=EnvironmentTokenApiHandler(
root_url="https://core.arago.co",
# Disable any verification.
ssl_config=SSLConfig(verify=False)
)
)
query_result = hiro_client.query('ogit\\/_type:"ogit/MARS/Machine"')
print(query_result)
示例:设置自定义 SSL 证书
from hiro_graph_client import EnvironmentTokenApiHandler, HiroGraph, SSLConfig
hiro_client: HiroGraph = HiroGraph(
api_handler=EnvironmentTokenApiHandler(
root_url="https://core.arago.co",
# Set custom certification files. If any of them are omitted, system defaults will be used.
ssl_config=SSLConfig(
cert_file="<path to client certificate file>",
key_file="<path to key file for the client certificate>",
ca_bundle_file="<path to the ca_bundle to verify the server certificate>"
)
)
)
query_result = hiro_client.query('ogit\\/_type:"ogit/MARS/Machine"')
print(query_result)
图形客户端“HiroGraph”
Graph Client 使用起来非常简单,因为此类的所有公共方法都表示 Graph API中的 API 调用。文档也可以在源代码中找到。有些调用有点复杂,下面会更详细地解释:
附件
要将数据上传到这样的顶点,请使用HiroGraph.post_attachment(data=...)
. 该参数data=
将直接requests
作为 requests.post(data=...)
. 要流式传输数据,请设置data
为 类型的对象IO
。requests
有关更多详细信息,请参阅 Python 库的文档。
下载附件是分块完成的,因此在流式传输这些数据时可以避免内存中的大量数据。每个块默认为 64k。
要将此类附件流式传输到文件,请参见以下示例:
ogit_id = '<ogit/_id of a vertex>'
data_iter = hiro_client.get_attachment(ogit_id)
with io.start("attachment.bin", "wb") as file:
for chunk in data_iter:
file.write(chunk)
要读取内存中的完整数据,请参见以下示例:
ogit_id = '<ogit/_id of a vertex>'
data_iter = hiro_client.get_attachment(ogit_id)
attachment = b''.join(data_iter)
网络套接字
该库包含使使用 HIRO WebSocket 协议更容易的类。它们处理身份验证、异常等等。
这些类不处理消息的缓冲,因此程序员有责任确保传入的消息要么被快速处理,要么被缓冲以避免阻塞 websocket。这些类是线程安全的,因此可以在其自己的线程中异步处理每个传入消息,并在需要时让这些线程发回结果(请参阅Action WebSocket中的多线程示例)。
关闭 WebSocket
要彻底关闭这些 WebSockets ( ws ),请考虑以下场景:
默认行为
库对KeyboardInterrupt (SIGINT) 做出反应,并在收到此类中断时通过关闭消息干净地关闭 WebSocket。如果收到另一个信号(如 SIGTERM),程序将立即停止,而不会向服务器返回任何关闭消息。
信号处理
安装信号处理程序时,您需要使用ws.signal_stop()来关闭 WebSocket。不要使用 ws.stop()否则关闭过程会死锁。这是因为信号中断是在与ws.run_forever()相同的线程中执行的。
例子:
import signal
[...]
with ActionWebSocket(api_handler=FixedTokenApiHandler('HIRO_TOKEN')) as ws:
def signal_handler(signum, handler):
ws.signal_stop()
signal.signal(signal.SIGINT, signal_handler)
signal.signal(signal.SIGTERM, signal_handler)
signal.signal(signal.SIGHUP, signal_handler) # This signal might not be available on MS Windows
ws.run_forever()
从单独的线程关闭
当从另一个线程而不是运行ws.run_forever()的线程关闭 WebSocket 时,您应该使用ws.stop()。这确保了关闭是同步的,并且ws.stop()将在 WebSocket 关闭后返回。
事件 WebSocket
此 websocket 接收有关更改与某个过滤器匹配的顶点的通知。
例子:
import threading
from hiro_graph_client.clientlib import FixedTokenApiHandler
from hiro_graph_client.eventswebsocket import AbstractEventsWebSocketHandler, EventMessage, EventsFilter
class EventsWebSocket(AbstractEventsWebSocketHandler):
def on_create(self, message: EventMessage):
""" Vertex has been created """
print("Create:\n" + str(message))
def on_update(self, message: EventMessage):
""" Vertex has been updated """
print("Update:\n" + str(message))
def on_delete(self, message: EventMessage):
""" Vertex has been removed """
print("Delete:\n" + str(message))
events_filter = EventsFilter(filter_id='testfilter', filter_content="(element.ogit/_type=ogit/MARS/Machine)")
with EventsWebSocket(api_handler=FixedTokenApiHandler('HIRO_TOKEN'),
events_filters=[events_filter],
query_params={"allscopes": "false", "delta": "false"}) as ws:
ws.run_forever() # Use KeyboardInterrupt (Ctrl-C) to exit.
如果您不设置参数scope=
,将使用您帐户的默认范围。如果您需要手动设置范围,请使用以下命令:
[...]
api_handler = FixedTokenApiHandler('HIRO_TOKEN')
default_scope = api_handler.decode_token()['data']['default-scope']
with EventsWebSocket(api_handler=api_handler,
events_filters=[events_filter],
scopes=[default_scope],
query_params={"allscopes": "false", "delta": "false"}) as ws:
ws.run_forever() # Use KeyboardInterrupt (Ctrl-C) to exit.
动作 WebSocket
此 websocket 接收有关已在 KI 中触发的操作的通知。使用它来编写您自己的自定义操作处理程序。
简单的例子:
import threading
from hiro_graph_client.actionwebsocket import AbstractActionWebSocketHandler
from hiro_graph_client.clientlib import FixedTokenApiHandler
class ActionWebSocket(AbstractActionWebSocketHandler):
def on_submit_action(self, action_id: str, capability: str, parameters: dict):
""" Message *submitAction* has been received """
# Handle the message
print(f"ID: {action_id}, Capability: {capability}, Parameters: {str(parameters)}")
# Send back message *sendActionResult*
self.send_action_result(action_id, "Everything went fine.")
def on_config_changed(self):
""" The configuration of the ActionHandler has changed """
pass
with ActionWebSocket(api_handler=FixedTokenApiHandler('HIRO_TOKEN')) as ws:
ws.run_forever() # Use KeyboardInterrupt (Ctrl-C) to exit.
使用线程执行器的多线程示例:
import threading
import concurrent.futures
from hiro_graph_client.actionwebsocket import AbstractActionWebSocketHandler
from hiro_graph_client.clientlib import FixedTokenApiHandler, AbstractTokenApiHandler
class ActionWebSocket(AbstractActionWebSocketHandler):
def __init__(self, api_handler: AbstractTokenApiHandler):
""" Initialize properties """
super().__init__(api_handler)
self._executor = None
def start(self) -> None:
""" Initialize the executor """
super().start()
self._executor = concurrent.futures.ThreadPoolExecutor()
def stop(self, timeout: int = None) -> None:
""" Shut the executor down """
if self._executor:
self._executor.shutdown()
self._executor = None
super().stop(timeout)
def handle_submit_action(self, action_id: str, capability: str, parameters: dict):
""" Runs asynchronously in its own thread. """
print(f"ID: {action_id}, Capability: {capability}, Parameters: {str(parameters)}")
self.send_action_result(action_id, "Everything went fine.")
def on_submit_action(self, action_id: str, capability: str, parameters: dict):
""" Message *submitAction* has been received. Message is handled in thread executor. """
if not self._executor:
raise RuntimeError('ActionWebSocket has not been started.')
self._executor.submit(ActionWebSocket.handle_submit_action, self, action_id, capability, parameters)
def on_config_changed(self):
""" The configuration of the ActionHandler has changed """
pass
with ActionWebSocket(api_handler=FixedTokenApiHandler('HIRO_TOKEN')) as ws:
ws.run_forever() # Use KeyboardInterrupt (Ctrl-C) to exit.
变更日志
v5.3.0
- 通过 static 解码任何令牌
decode_token_ext()
。
/api/auth/6.6 的更改:
- 撤销令牌的能力。
- 识别
access_token
并_TOKEN
在令牌结果中。 - 从类 TokenInfo 中删除过时的方法
fresh()
,因为现在每个令牌刷新都会默认发出一个新的 refresh_token。
v5.2.5
- [错误修正]当没有expires_at 可用于令牌时, clientlib.TokenInfo.expired()中的计算现在按预期返回False 。以前的版本会引发异常。
v5.2.4
- 在 AbstractAPI 中合并标题而不是替换它们。
v5.2.3
- 永久删除 accept_all_certs。直接使用 SSLConfig 中的标志。
v5.2.2
- 调试的python代码文档。
- 修复了版权声明。
v5.2.1
v5.2.0
- 将连接会话与令牌处理程序分开。介绍
GraphConnectonHandler
可以在TokenApiHandler
s 和 API-Classes 之间共享的类。 - 更新了文档。
v5.1.0
- 通过 requests.Session 使用连接池。
- 设置
pool_connections=1
,pool_maxsize=10
默认情况下(后者可以更改)。 - 阻止
pool_block
任何超过pool_maxsize
.
- 设置
- 删除过时
accept_all_certs()
的。 - 修复了 Makefile 目标中的 pytest。
requests.Session
添加了有关pool_maxsize
文档的信息。
v5.0.0
- 在https://github.com/arago/hiro-batch-client-python
batchclient.py
将其作为自己的项目外部化。
v4.9.0
- 添加了问题的批处理。
handle_vertices_combined
现在识别_issue_data
与顶点直接相关的问题。 - 更新了文档。
v4.8.0
-
重构
websocketlib.py
:- 删除了不必要的额外线程。
- 通过信号和线程调试 WebSockets 的关闭。
- 更新的文档:
- 关于信号处理。
- 完全关闭 WebSockets。
- 调整了 WebSockets 的示例代码。
-
允许
-
或_
作为测试标签上的内部版本号分隔符,即t4.8.0_0
现在t4.8.0-0
处理相同。
v4.7.5
- [预算修复] 在 AbstractActionWebSocketHandler 中处理
self.submitStore
并self.resultStore
正确关闭。当启动失败时,它们可能根本没有被初始化。
v4.7.4
- [错误修正] 使用 PasswordAuthTokenHandler 和 refresh_token 时捕获 401。当这发生触发重试时引发 TokenUnauthorizedError。
v4.7.3
- 重构
HiroGraphBatch
. 删除了过时的方法。
v4.7.2
- 修复了 IAM API 中对 patch() 方法的错误调用。
v4.7.1
-
HiroGraph
更新了一些过时的代码文档。 -
更新了图表查询
HiroGraph
:- 对于顶点和 gremlin 查询:跳过查询有效负载中不必要的字段。
count
向顶点查询添加参数。
-
将默认 _client_name 重命名为
hiro-graph-client
(PyPI 上的库名称)。
v4.7.0
-
内容/媒体类型处理
WrongContentTypeError
当返回意外(或丢失)的 Content-Type 时抛出。- 检查构造 HTTPError 的错误结果的 Content-Type。
-
错误处理
- 单独的错误消息提取,因此可以按 API 覆盖。
- 尝试通过猜测它们的错误消息可能在哪里来处理不同的消息格式。
- 拦截 API 的特殊错误消息
ki
。 log_communication_on_error
在响应中检测到错误时启用通信记录的标志。
-
max_tries
向 TokenHandlers添加参数。
v4.6.2
- 添加了新 API 的文档
v4.6.1
- 更新了 CHANGELOG.md
v4.6.0
- 添加了以下 API:
- KI
- 授权Z
- 变量
- 使用返回字典列表的 API 方法调整返回值类型。
v4.5.2
错误修复
- 以前的版本错误地将 True 和 False 翻译为“True”和“False”,而 URL 查询中需要“true”和“false”(小写)。固定的。
v4.5.1
- 添加
decode_token()
以解码嵌入在 HIRO 令牌中的信息。
v4.5.0
- GitHub 存储库从 重命名
python-hiro-clients
为hiro-client-python
. 没有其他技术变化。
v4.4.0
- 添加了 IAM 客户端
- 更新了 Graph 客户端和 Auth 客户端
- put_binary 现在允许返回简单的字符串。(即用于头像图像更新)。
v4.3.0
- 添加 SSL 配置
v4.2.14
- 删除了 websocketlib 中使用反向运算符的错误。
- 更新了 README.md 中的安装说明。
v4.2.13
query_params={'allscopes': 'true'}
如果要为 EventWebSockets 启用它,则需要显式设置。如果在 query_params 中忽略它,它将被添加为 'allscopes': 'false'。
v4.2.12
- 使用类型来确保
query_params=
WebSockets 的类型是Dict[str, str]
. - 设置
query_params={'allscopes': 'false'}
为 EventWebSocket 的默认值。
v4.2.11
- 调试的 EventWebSocket 处理。
- 设置范围或过滤器失败时中止连接。
v4.2.10
- 向 EventWebSockets 添加范围。
v4.2.9
- v4.2.8 中的功能文档
v4.2.8
- WebSockets 有新的选项
query_params
可以将任意查询参数添加到初始 websocket 请求中。
v4.2.7
更改为AbstractAuthenticatedWebSocketHandler
:
-
介绍
run_forever()
which 将在加入阅读器线程后返回。当另一个线程调用stop()
(正常退出)或发生内部错误时,可能会发生这种情况,直接在尝试连接时,令牌无效且无法刷新,或在内部读取器线程中引发的任何其他异常。这确保了当 websocket 读取器线程不存在时主线程不会继续。
-
send()
启用跨多个线程的并行执行。 -
确保只有一个线程通过调用来触发重启
restart()
。 -
通过 . 检查活动的 websocket 阅读器线程
is_active()
。 -
更新 README.md 中的 websocket 示例。
通用的
- 更新 README.md 以显示
client_name
.
v4.2.6
- 不需要包 uuid - python 已经提供了它
v4.2.5
- 向后端发送有效的关闭消息。
- 引入参数
client_name
以给连接命名并User-Agent
更轻松地设置标题。
v4.2.4
- 更新了 CHANGELOG.md。
v4.2.3
- 强化客户端库。删除了一些无值错误。
v4.2.2
- 将参数
remote_exit_codes
引入AbstractAuthenticatedWebSocketHandler
.
v4.2.1
_backoff()
通过不使用sleep()
but来避免阻塞线程threading.Condition.wait()
。
v4.2.0
- 实现 websocket 协议
- 事件-ws
- 动作ws
v4.1.3
- 使用 yield from 而不是 return
v4.1.2
- 删除了二进制数据双倍收益的错误
v4.1.1
- 仅在启用 logging.DEBUG 时记录请求/响应
v4.1.0
- 向命令添加了时间序列处理
handle_vertices_combined
v4.0.0
-
AbstractTokenApiHandler
- 更好的令牌处理。
- 通过调用 /api/version 解析图形 api 端点。
- 能够自定义标题。标头以不区分大小写的方式处理,并提交给大写的请求。
- 能够覆盖内部端点。
-
AbstractIOCarrier
with
现在适用于语句。 -
添加
BasicFileIOCarrier
. -
已删除
ApiConfig
。 -
重命名了几个内部类。
-
更好的错误信息。
-
HTTP 安全协议日志记录。
-
修复了令牌的时间戳创建。
-
乔的建议 - 谢谢乔!
v3.1.0
- 在客户端库中分离 API。目前,支持的 API 有:
- 在二进制传输中使用正确的标头。
- 向 HiroGraph 添加了 gremlin 和多 id 查询。
v3.0.0
- 重命名类以匹配其他地方的文档(即 Graphit -> HiroGraph、GraphitBatch -> HiroGraphBatch)。
- 当 refresh_token 过期时捕获令牌过期错误。
- 带有示例的文档
v2.4.2
在 setup.py 中为 package_data 添加了 VERSION
v2.4.1
为 PyPI 添加了文档