04 客户端调用与 REST 模式
调用方式总览
调用 RhinoCompute 有四种常见方式:
| 方式 | 适合场景 |
|---|---|
| Python 客户端库 | 数据脚本、自动化、研究计算、后台任务。 |
| JavaScript 客户端库 | Web 前端、Node.js 服务、浏览器几何预览。 |
| .NET 客户端 | C# 服务、桌面工具、企业内部系统。 |
| 直接 REST | 非官方语言、调试、网关服务、最小化依赖。 |
无论哪种方式,本质都是把几何和参数序列化为 JSON,通过 HTTP 发给 Compute,再把结果反序列化为客户端语言中的几何对象或数据结构。
API Key 规则
服务端配置:
RHINO_COMPUTE_KEY=your-secret-key
客户端请求 header:
RhinoComputeKey: your-secret-key
本地开发可以临时不配置 API Key,但生产环境必须配置,并且不要把 key 写死在浏览器前端源码中。浏览器应用应通过自己的后端代理 Compute 请求。
Python 调用
安装:
pip install rhino3dm compute-rhino3d
典型结构:
import rhino3dm import compute_rhino3d.Util import compute_rhino3d.Mesh compute_rhino3d.Util.url = "http://localhost:6500/" compute_rhino3d.Util.authToken = "local-dev-key" sphere = rhino3dm.Sphere(rhino3dm.Point3d(0, 0, 0), 12) brep = sphere.ToBrep() meshes = compute_rhino3d.Mesh.CreateFromBrep(brep) print("mesh count:", len(meshes))
教学重点:
rhino3dm在客户端构造和读写基础几何。compute_rhino3d调远程 RhinoCommon 能力。- 包名安装时是
compute-rhino3d,导入时是compute_rhino3d。
JavaScript 调用
Node.js 安装:
npm install rhino3dm compute-rhino3d
Node.js 典型结构:
import rhino3dm from 'rhino3dm' import RhinoCompute from 'compute-rhino3d' const rhino = await rhino3dm() RhinoCompute.url = 'http://localhost:6500/' RhinoCompute.authToken = 'local-dev-key' const sphere = new rhino.Sphere([0, 0, 0], 12) const brep = sphere.toBrep() const meshes = await RhinoCompute.Mesh.createFromBrep(brep) console.log(meshes.length)
浏览器端也可以使用 rhino3dm.js 和 compute-rhino3d.js,但生产架构中不建议浏览器直接持有 Compute API Key。推荐:
浏览器 -> 业务后端 API -> RhinoCompute
.NET 调用
.NET 项目通常使用:
Rhino3dmNuGet 包。Newtonsoft.JsonNuGet 包。RhinoCompute.cs客户端源文件。
典型结构:
using Rhino.Geometry; using Rhino.Compute; class Program { static void Main() { ComputeServer.WebAddress = "http://localhost:6500/"; ComputeServer.ApiKey = "local-dev-key"; var sphere = new Sphere(Point3d.Origin, 12); var brep = sphere.ToBrep(); var meshes = MeshCompute.CreateFromBrep(brep); Console.WriteLine($"mesh count: {meshes.Length}"); } }
如果客户端库 API 名称与当前版本略有差异,以你项目引入的 RhinoCompute.cs 为准。
直接 REST 调用
直接 REST 适合调试协议或做语言无关集成。基本模式:
POST http://server/path/to/compute/endpoint Header: Content-Type: application/json RhinoComputeKey: your-secret-key Body: JSON encoded arguments
直接 REST 的难点不在 HTTP,而在几何序列化。建议优先用官方客户端库生成请求格式,确认端点路径和 JSON 结构,再封装自己的调用层。
Grasshopper REST 模式
Grasshopper 求解通常使用 Resthopper 数据结构:
- 定义文件:
*.gh或已经上传/缓存的定义引用。 - 输入:DataTree 结构,按参数名和路径传值。
- 输出:DataTree 结构,包含每个输出参数的结果集合。
这类请求非常适合:
- 参数化模型生成。
- 复杂业务规则封装成 Grasshopper 定义。
- 由非 Rhino 客户端触发 Grasshopper 求解。
但它也要求定义本身可在无界面服务器中稳定运行。不要在定义中依赖人工交互、弹窗、屏幕选择或本机绝对路径。
请求设计建议
- 让每个请求自包含,避免依赖服务器残留状态。
- 大文件用对象存储或预上传机制,避免把所有内容塞入单个 JSON。
- 给每个业务请求生成 correlation id,写入外层服务日志,方便和 Compute 日志对齐。
- 把 Compute 调用封装在业务服务内,便于统一重试、超时、限流、认证、审计。
- 客户端超时应略大于 Compute 服务端超时,否则客户端可能先断开但服务器仍在算。
本章检查点
- Python 是否能安装
rhino3dm和compute-rhino3d? - JavaScript 是否能正确加载
rhino3dm和compute-rhino3d? - 你是否知道 API Key 应放在
RhinoComputeKeyheader? - 你是否能说明为什么浏览器前端不应直接保存 Compute API Key?