====== 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 项目通常使用: * ''Rhino3dm'' NuGet 包。 * ''Newtonsoft.Json'' NuGet 包。 * ''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 应放在 ''RhinoComputeKey'' header? * 你是否能说明为什么浏览器前端不应直接保存 Compute API Key? ===== 参考资料 ===== * [[https://developer.rhino3d.com/guides/compute/compute-python-getting-started/|Calling Compute with Python]] * [[https://developer.rhino3d.com/guides/compute/compute-javascript-getting-started/|Calling Compute with JavaScript]] * [[https://developer.rhino3d.com/guides/compute/compute-net-getting-started/|Calling Compute with .NET]] * [[https://developer.rhino3d.com/guides/compute/compute-faq/|Compute FAQ]]