gpt4 book ai didi

java - 从 WSDL 到 java

转载 作者:行者123 更新时间:2023-11-30 03:17:57 26 4
gpt4 key购买 nike

我的任务是在 Java 中查询 SOAP 客户端,但我对如何继续前进感到有点困惑。

我做的第一件事就是使用Wizdler chrome 插件来原型(prototype)化我的 SOAP 请求。我相信 SOAP “信封”必须采用这种格式才能发挥作用。

<Envelope xmlns="http://www.w3.org/2003/05/soap-envelope">
<Body>
<GetMyProjectCharges xmlns="http://COMPANY.IWWeb.Data.Service.ProjectCharges">
<Employee>[string?]</Employee>
<FiscalYear>[string?]</FiscalYear>
<ApiKey>[string?]</ApiKey>
<AppName>[string?]</AppName>
</GetMyProjectCharges>
</Body>
</Envelope>

接下来,我学习了一些关于如何在 java 中构建 SOAP 信封的各种教程,但我不断陷入一种奇怪的情况,我得到 <SOAP-ENV:所有内容都有前缀,当我获取生成的信封并尝试将其粘贴到 chrome 插件中时,它不起作用。

所以我想知道我该去哪里?我意识到 SOAP 是一个相当繁重的协议(protocol),所以也许这就是让我困惑的地方,但我想要做的(目前)是:

1)在java中生成符合上述格式的soap请求,并打印出结果。

我知道我“可能”可以选择 Maven 或某些程序来从 WDSL 为我生成一些类文件,但我也不太确定我用它做什么。谢谢!

如有任何帮助,我们将不胜感激。

最佳答案

您有两种方法来执行 SOAP 请求。

解决方案1

如果您使用 netbeans 作为代码 IDE,则必须创建一个项目,右键单击包并选择“新建”>>“Web 服务客户端”。插入soap端点的url并单击确定。如果您的 ide 中安装了 jax-ws/Metro 扩展,netbeans 将生成所有必要的类以编程方式调用服务。 (有困难就问我)

解决方案2

你可以简单地使用javax.xml来实现soap请求

private SOAPMessage invoke(QName serviceName, QName portName,
String soapActionUri) throws Exception {

Service service = Service.create(serviceName);
service.addPort(portName, SOAPBinding.SOAP11HTTP_BINDING, endpointUrl);

Dispatch dispatch = service.createDispatch(portName,
SOAPMessage.class, Service.Mode.MESSAGE);

dispatch.getRequestContext().put(Dispatch.SOAPACTION_USE_PROPERTY, new Boolean(true));
dispatch.getRequestContext().put(Dispatch.SOAPACTION_URI_PROPERTY, soapActionUri);

MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage message = messageFactory.createMessage();

SOAPPart soapPart = message.getSOAPPart();
SOAPEnvelope envelope = soapPart.getEnvelope();
SOAPBody body = envelope.getBody();

Source source = new DOMSource(getQueryString());
soapPart.setContent(source);

message.saveChanges();

System.out.println(message.getSOAPBody().getFirstChild().getTextContent());

SOAPMessage response = (SOAPMessage) dispatch.invoke(message);

return response;
}

private Node getQueryString() throws SAXException, IOException, ParserConfigurationException {
StringBuilder builder = new StringBuilder();
builder.append("<soapenv:Envelope");
// create your body
builder.append("</soapenv:Body>");
builder.append("</soapenv:Envelope>");

DocumentBuilderFactory docfactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docbuilder = docfactory.newDocumentBuilder();
Document stringDocument = docbuilder.parse(new InputSource(new StringReader(builder.toString())));

return stringDocument;
}

并调用服务使用

String targetNameSpace = "your target namespace";
QName serviceName = new QName(targetNameSpace, "your service name");
QName portName = new QName(targetNameSpace, "Your port name");
String SOAPAction = "your soap action";
SOAPMessage response = invoke(serviceName, portName, SOAPAction);
if (response.getSOAPBody().hasFault()) {
System.out.println(response.getSOAPBody().getFault());
}

附注请原谅我的英语:(

关于java - 从 WSDL 到 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32098393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com