我只需要一个SOAP客户端来进行远程调用,但我有点像一个Groovy菜鸟.根据Groovy文档,不推荐使用标准的Groovy SOAP库.相反,文档指向更新的库:GroovyWS.
不幸的是,GroovyWS有一个警告说该项目处于休眠状态,然后它指向Groovy WSLite.
实际上,Groovy WSLite似乎仍在积极开发中,但与之前的2个库相比,并不是非常"Groovy-ish".wslite每个人都在使用什么?
我遇到了使用GroovyWS发送复杂请求的问题.
这是soapUI生成的示例请求:
<soapenv:Envelope
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:dex="http://www.temp.com/com/dex"
>
<soapenv:Header/>
<soapenv:Body>
<dex:executeRequest>
<!--Optional:-->
<a>?</a>
<!--Optional:-->
<b>?</b>
<!--Optional:-->
<parameters>
<!--Zero or more repetitions:-->
<parameter>
<!--Optional:-->
<key>?</key>
<!--Optional:-->
<value>?</value>
</parameter>
</parameters>
<!--Optional:-->
<c>?</c>
<!--Optional:-->
<d>?</d>
</dex:feedrequest>
</soapenv:Body>
</soapenv:Envelope>
Run Code Online (Sandbox Code Playgroud)
一段时髦的代码:
def proxy = webService.getClient(grailsApplication.config.ws.endpoint);
proxy.processdRequest(?);
Run Code Online (Sandbox Code Playgroud)
那么我应该通过什么而不是?.
谢谢你的帮助.
-vova.
GroovyWS是一个内部使用CXF的框架.我想提出如下要求:
<param2 xsi:type="ns2:Map">
<item xsi:type="ns2:Map">
<key xsi:type="xsd:string">param1</key>
<value xsi:type="xsd:string">param2</value>
</item>
</param2>
Run Code Online (Sandbox Code Playgroud)
目前我正在尝试通过grails服务执行此操作,如下所示:
def proxy = new WSClient("http://xyz", this.class.classLoader)
proxy.initialize()
proxy.client.invoke("call", new HashMap<String, String>())
Run Code Online (Sandbox Code Playgroud)
这使
javax.xml.bind.JAXBException
class java.util.HashMap nor any of its super class is known to this context.
Run Code Online (Sandbox Code Playgroud)
我甚至试过[:]和东西,但不要让它工作.
我正在为.net SOAP服务创建一个Groovy客户端,它需要一个如下所示的soap标头:
<soap:Header>
<HeaderInfo xmlns="http://foo.bar.com/ns">
<token>abc-unique-token</token>
</HeaderInfo>
</soap:Header>
Run Code Online (Sandbox Code Playgroud)
我找到了为CXF消息添加标题的常见问题,它让我几乎到了那里,但并不完全.他们为选项4提供的示例如下所示:
List<Header> headers = new ArrayList<Header>()
Header header = new Header(new QName("http://foo.bar.com/ns", "HeaderInfo"),
"abc-unique-token", new JAXBDataBinding(String.class))
headers.add(header)
proxy.client.getRequestContext().put(Header.HEADER_LIST, headers)
Run Code Online (Sandbox Code Playgroud)
使用此代码,我可以这样做:
<soap:Header>
<HeaderInfo xmlns="http://foo.bar.com/ns">
abc-unique-token
</HeaderInfo>
</soap:Header>
Run Code Online (Sandbox Code Playgroud)
但是"HeaderInfo"节点缺少子"令牌"节点以包围"abc-unique-token",我不知道如何在那里获取它.
是否有一些简单的事情我可以传递给Header构造函数来创建该节点?
一篇单独的文章讨论了使用不同的技术,但是当我尝试使用它时,这会在SoapFactory周围抛出错误.
我发现的许多其他东西需要创建一些扩展AbstractPhaseInterceptor类的东西,带有一堆额外的代码,当我想要的是如此接近:).
我需要使用 Groovy HTTP Builder 更新 Zendesk Tickets。我使用以下代码
@Grab(group='org.codehaus.groovy.modules.http-builder', module='http-builder', version='0.5.0-RC2' )
import java.util.Properties;
import java.io.InputStream;
import java.io.ByteArrayInputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import groovyx.net.http.*;
import static groovyx.net.http.Method.*;
import groovy.json.*;
import groovyx.net.http.ContentType;
def jsonBuilder = new groovy.json.JsonBuilder();
class MyTicket
{
def subject
}
def myTicket = new MyTicket(
subject: 'xyz'.toString()
)
def ticketList=[myTicket]
jsonBuilder(ticket:ticketList)
println(jsonBuilder)
def authSite = new HTTPBuilder('https://{subdomain}.zendesk.com/api/v2/tickets/{ticketid}.json');
authSite.auth.basic 'username', 'password';
authSite.request( Method.PUT, ContentType.JSON )
{ req ->
uri.path = ''https://{subdomain}.zendesk.com/api/v2/tickets/{ticketid}.json'';
requestContentType = ContentType.JSON;
headers.Accept = 'application/json';
body =[jsonBuilder]
response.success …
Run Code Online (Sandbox Code Playgroud)