Web services 在Orbeon xforms中调用REST Web服务

Web services 在Orbeon xforms中调用REST Web服务,web-services,rest,orbeon,Web Services,Rest,Orbeon,我是Orbeon xforms的新手,所以我在这里提问。我有一个REST webservice,它有一个地址(方法GET),我想打电话给他,结果应该提供给我表单的元数据: <!-- Main instance --> <xforms:instance id="fr-form-instance"> <form> <section-meta> <resultOfMyRestWebservice/&g

我是Orbeon xforms的新手,所以我在这里提问。我有一个REST webservice,它有一个地址(方法GET),我想打电话给他,结果应该提供给我表单的元数据:

<!-- Main instance -->
<xforms:instance id="fr-form-instance">
    <form>
        <section-meta>
            <resultOfMyRestWebservice/>

我曾尝试遵循本教程(拉式解决方案),但我不知道如何将rest的结果放在marker:ResultToMyRestWebService中,以及必须将提交代码放在哪里:

<xforms:submission
    id="load-data-submission"
    method="get" serialization="none"
    resource="addressOfMyRestWS/{xxforms:get-request-parameter('myParam')}"
    replace="?" instance="?"/>


关于

如果我是你,我会使用一个临时运行时实例来保存REST调用的结果,然后使用setvalue填充持久化实例

如果您在模型中定义了元数据的结构,那么下面的示例就可以使用setvalue进行填充。否则,您可以使用insert

即,在xforms:model中定义:

<!-- Run-time instance to hold Service response -->
<xforms:instance id="fr-service-response-instance" xxforms:exclude-result-prefixes="#all">
    <response/>
</xforms:instance>

定义要替换此响应实例的提交:

<xforms:submission id="load-data-submission" method="get"
    serialization="none" mediatype="application/xml"
    resource="addressOfMyRestWS/{xxforms:get-request-parameter('myParam')}"
    replace="instance" instance="fr-service-response-instance"/>
<!-- Populate Data
     uses Load Data Submission
     runs on form load -->
<xforms:action id="populate-data-binding">
    <xforms:action ev:event="xforms-ready" ev:observer="fr-form-model" if="true()">
         <xforms:send submission="load-data-submission"/>
    </xforms:action>
    <!-- Populate resultOfMyRestWebservice control with pathToResults value
         following successful submission -->
    <xforms:action ev:event="xforms-submit-done" ev:observer="load-data-submission"
                context="instance('fr-service-response-instance')">
         <xforms:action>
               <xf:var name="control-name" value="'resultOfMyRestWebservice'" as="xs:string"/>
               <xf:var name="control-value" value="/pathToResults" as="xs:string"/>
               <xforms:setvalue ref="instance('fr-form-instance')/*/*[name() = $control-name]"
                        value="$control-value"/>
         </xforms:action>
    </xforms:action>
</xforms:action>

然后创建一个操作来调用提交并填充实例:

<xforms:submission id="load-data-submission" method="get"
    serialization="none" mediatype="application/xml"
    resource="addressOfMyRestWS/{xxforms:get-request-parameter('myParam')}"
    replace="instance" instance="fr-service-response-instance"/>
<!-- Populate Data
     uses Load Data Submission
     runs on form load -->
<xforms:action id="populate-data-binding">
    <xforms:action ev:event="xforms-ready" ev:observer="fr-form-model" if="true()">
         <xforms:send submission="load-data-submission"/>
    </xforms:action>
    <!-- Populate resultOfMyRestWebservice control with pathToResults value
         following successful submission -->
    <xforms:action ev:event="xforms-submit-done" ev:observer="load-data-submission"
                context="instance('fr-service-response-instance')">
         <xforms:action>
               <xf:var name="control-name" value="'resultOfMyRestWebservice'" as="xs:string"/>
               <xf:var name="control-value" value="/pathToResults" as="xs:string"/>
               <xforms:setvalue ref="instance('fr-form-instance')/*/*[name() = $control-name]"
                        value="$control-value"/>
         </xforms:action>
    </xforms:action>
</xforms:action>


注意pathToResults是指向您希望从结果中得到的值的xpath。

我做了前面提到的教程中提到的所有事情:我的意思是:

。。。。
....
....
....
....
我想从link()中获取xml,放入“user data”实例,然后获取第一个名称并放入“fr form instance”中的“name”标记。不幸的是,它不起作用,我的意思是setvalue不起作用,因为当我这样更改“用户实例”时:

<xf:instance id="user-data">
    <registration>
        <first-name>SomeName</first-name>
        <last-name/>
    </registration>
</xf:instance>

名字
它正在工作,最终的xml如下所示:

....
<name>SomeName</name>
....
。。。。
名字
....
我真的不知道为什么它不起作用

问候

///

现在我看到我的问题可能会归结为:

它的工作原理是:

<xforms:instance id="user-data" src="http://example.org/service/load-initial-form-data-pull-instance"/>

而且它不起作用:

<xforms:send ev:event="xforms-model-construct-done" submission="load-data-submission"/>
<xforms:submission id="load-data-submission"
               method="get" serialization="none"
               resource="http://example.org/service/load-initial-form-data-pull-instance"
               replace="instance" instance="user-data"/>


我必须使用第二种方法,因为我必须将一些参数传递给resource(resource=“http…/{xxforms:get request parameter('myParam')))

PS我应该将此解决方案归功于Form Builder处理Web服务的方式。谢谢。不幸的是,此代码:在我的代码中出错。你能描述一下我如何将你的代码与这样的东西合并吗:例如,如果我想把webservice的结果放在名字的前面。你检查过名称空间了吗?它们从
xxforms
移动到
xxf
xforms
xf
,所以可能这就是错误的来源。如果我想从varialble或instance设置xpath,我该怎么办?我的意思是我有一个值为“/myXpath”的实例,我想设置:而不是?当我运行这段代码时,它不起作用(结果是:“/myXpath”,而不是来自XMLREST节点的值)