基本自定义 > 用户界面自定义 > 构造向导 > 使用 MVC 控制器处理外部请求 > 解决方案
  
解决方案
在外部系统中,启动一个新的 HTML 窗口,它会向 Windchill 系统发出 POST 请求并返回所创建的对象 ID。
必备知识
要应用此过程,需要了解以下内容:
使用 HTML 表单的基本 Web 开发
序列图
用户使用外部系统中的新窗口单击已注册的 Windchill 外部系统中的创建操作。
URL 会重定向对已注册 MVC 控制器的调用,然后调用已注册的 JSP 并为所请求的操作和对象类型重定向创建 JSP。
创建 Windchill 对象后,JSON 对象会以 "UFIDs" 键返回到调用程序。表单方法为 "GET",外部 URL 必须读取 URL 查询参数。
有关详细信息,请参阅下面的示例方案。
限制
调用操作后,将在 Windchill 事务块内执行该操作。
回调值将基于浏览器对 "GET" 表单方法的支持。
从外部系统调用 Windchill 服务器
假设
1. 选定对象和上下文对象信息可供外部系统使用。
2. 启动 URL 的用户有权访问该操作。
3. 应对上下文对象的输入字段进行编码,容器的示例上下文对象类似于 "OR%3Awt.pdmlink.PDMLinkProduct%3A38380"
处理多个选定对象
要处理在创建向导表格中填充种子数据的多个选定对象,请使用名为 "soidarray" 的隐藏字段,并将 "___" 用作各对象间的分隔符。在上面的示例中,“新建更改请求”向导将填充受影响对象表格中的两个部件。发布表单数据时,不应对对象标识符进行编码。
注意事项
框架窗口的访问权限需要完整的域名。使用完整的域 URL 替换 Windchill 系统 URL。例如,如果服务器位于 ptcnet.ptc.com 域中,则 URL 应包含
http://windchillServer.ptcnet.ptc.com/<web-app>/ptc1/externalRequest?
oid="+contextOid+"&action=create&type=changeRequest;"
而不包含
http://myserver/Windchill...
未授权的操作处理
如果提供了无效的操作或类型,或者用户没有权限在 Windchill 服务器上执行此操作,则会向外部系统用户显示错误。
回调外部系统
Windchill 系统发出请求时,将使用外部 URL 信息填充名称为 externalURL 的表单字段,请参阅下面的示例。如果未提供任何信息,则在发出请求时会创建 Windchill 对象,但是新创建的对象不会提供反馈。"GET" 表单方法用于传回数据。
访问创建的 Windchill 对象
在调用程序服务器中,外部 URL 将附加新参数 "UFIDs"。可读取 "UFIDs" 参数来检索值。这些值为 JSON 格式,因此可使用 "UFIDs" 键访问这些值。
假设
1. 使用所提供的外部 URL 的必需凭据对用户进行授权。
2. 外部 URL 的输入字段应随 name=externalURL 一起提供。外部 URL 示例如下所示:http://<externalURL>/<host-name>/ptc1/externalTest
处理多个 OID 的创建
外部回调功能支持返回请求操作的多个 OID。JSONObject 键 "UFIDs" 中将包含 UFID 值。
外部系统的示例代码
示例 HTML 将允许向 Windchill 系统发送外部请求。
<html>
<script>
launchJCAAction = function() {
var winName = "create";
var theForm = document.getElementById('JCAActionForm');
theForm.target = winName;
var contextOid = document.getElementById('contextOid').value;
theForm.action = "http://windchillHostname:port/<web-app>
/ptc1/externalRequest?oid=OR%3Awt.pdmlink.PDMLinkProduct
%3A36226&action=create&type=changeRequest";
var props = '';
var actionwin = window.open("", winName, props);
theForm.submit();
}
</script>
<body>
<form method="post" id="JCAActionForm"
onSubmit="return false;" target="_self">
Container Oid: <input type="text" id="contextOid"/>
External URL: <input type="text" name="externalURL"
value="http://externalHostname:port/<web-app>"/>
<input type="hidden" name="soidarray" value="OR:wt.part.WTPart:90740___
OR:wt.part.WTPart:547106"/>
<button onclick='launchJCAAction();'>Launch Action</button>
</form>
</body>
</html>
创建的 Windchill 对象的示例 UFID 如下所示:"VR:wt.change2.WTChangeRequest2:188695:651462062-1309389210495-20458805-192-14-253-132@<windchillServer>"