当前位置: 首页 > 知识库问答 >
问题:

如何从Java类调用SOAP Web服务?

公良高刚
2023-03-14

我对webservice世界相对来说是个新手,我的研究似乎让我困惑而不是启发,我的问题是我得到了一个库(jar),我必须用一些webservice功能来扩展它。

这个库将共享给其他开发人员,在jar中的类中,将有一个调用webservice的方法的类(该方法实质上设置类的属性,执行一些业务逻辑,如将对象存储在db中等,并将对象与这些修改一起发回)。我希望对这个服务的调用尽可能简单,希望尽可能简单,这样使用类的开发人员只需要做。

Car c = new Car("Blue");
c.webmethod();

我一直在研究如何在服务器上使用JAX-WS,但在我看来,我不需要在服务器上创建WSimPort,也不需要在客户端上创建WSimPort,因为我知道这两者都有类,我只需要在服务器和客户端中共享的类之间进行一些交互。您认为如何在类中执行webservice和调用是有意义的?

共有1个答案

司徒寒
2023-03-14

我理解您的问题归结为如何从Java调用SOAP(JAX-WS)web服务并获取其返回对象。在这种情况下,您有两种可能的方法:

  1. 通过wsimport生成Java类并使用它们;或
  2. 创建SOAP客户端,该客户端:
    1. 将服务参数序列化为XML;
    2. 通过HTTP操作调用web方法;和
    3. 将返回的XML响应解析回对象。


    关于第一种方法(使用WSimPort):

    不过,恐怕在这种情况下,你只能要么:

    • 调整(编辑)wsimport生成的代码,使其使用您的业务类(这很困难,而且不值得这样做--请记住,每次WSDL更改时,您都必须重新生成和重新调整代码);或
    • 放弃并使用WSimPort生成的类。(在此解决方案中,业务代码可以从另一个体系结构层“使用”生成的类作为服务。)

    关于第二种方法(创建自定义SOAP客户端):

      null
    • 使用OXM(Object to XML Mapping)框架(如JAXB)将XML序列化/反序列化对象/对象到对象
    • 或者,如果必须,手动创建/解析XML(如果接收的对象与发送的对象只有一点点不同,这可能是最好的解决方案)。

    使用经典的java.net.HTTPURLConnection创建SOAP客户机并不是那么难(但也不是那么简单),您可以在此链接中找到一个非常好的起始代码。

    我建议您使用SAAJ框架:

    SOAP with Attachments API for Java(SAAJ)主要用于直接处理SOAP请求/响应消息,这种消息发生在任何Web服务API的幕后。它允许开发人员直接发送和接收soap消息,而不是使用JAX-WS。

    请参阅下面的工作示例(运行它!)使用SAAJ调用SOAP web服务。它调用此web服务。

    import javax.xml.soap.*;
    
    public class SOAPClientSAAJ {
    
        // SAAJ - SOAP Client Testing
        public static void main(String args[]) {
            /*
                The example below requests from the Web Service at:
                 https://www.w3schools.com/xml/tempconvert.asmx?op=CelsiusToFahrenheit
    
    
                To call other WS, change the parameters below, which are:
                 - the SOAP Endpoint URL (that is, where the service is responding from)
                 - the SOAP Action
    
                Also change the contents of the method createSoapEnvelope() in this class. It constructs
                 the inner part of the SOAP envelope that is actually sent.
             */
            String soapEndpointUrl = "https://www.w3schools.com/xml/tempconvert.asmx";
            String soapAction = "https://www.w3schools.com/xml/CelsiusToFahrenheit";
    
            callSoapWebService(soapEndpointUrl, soapAction);
        }
    
        private static void createSoapEnvelope(SOAPMessage soapMessage) throws SOAPException {
            SOAPPart soapPart = soapMessage.getSOAPPart();
    
            String myNamespace = "myNamespace";
            String myNamespaceURI = "https://www.w3schools.com/xml/";
    
            // SOAP Envelope
            SOAPEnvelope envelope = soapPart.getEnvelope();
            envelope.addNamespaceDeclaration(myNamespace, myNamespaceURI);
    
                /*
                Constructed SOAP Request Message:
                <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myNamespace="https://www.w3schools.com/xml/">
                    <SOAP-ENV:Header/>
                    <SOAP-ENV:Body>
                        <myNamespace:CelsiusToFahrenheit>
                            <myNamespace:Celsius>100</myNamespace:Celsius>
                        </myNamespace:CelsiusToFahrenheit>
                    </SOAP-ENV:Body>
                </SOAP-ENV:Envelope>
                */
    
            // SOAP Body
            SOAPBody soapBody = envelope.getBody();
            SOAPElement soapBodyElem = soapBody.addChildElement("CelsiusToFahrenheit", myNamespace);
            SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("Celsius", myNamespace);
            soapBodyElem1.addTextNode("100");
        }
    
        private static void callSoapWebService(String soapEndpointUrl, String soapAction) {
            try {
                // Create SOAP Connection
                SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
                SOAPConnection soapConnection = soapConnectionFactory.createConnection();
    
                // Send SOAP Message to SOAP Server
                SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(soapAction), soapEndpointUrl);
    
                // Print the SOAP Response
                System.out.println("Response SOAP Message:");
                soapResponse.writeTo(System.out);
                System.out.println();
    
                soapConnection.close();
            } catch (Exception e) {
                System.err.println("\nError occurred while sending SOAP Request to Server!\nMake sure you have the correct endpoint URL and SOAPAction!\n");
                e.printStackTrace();
            }
        }
    
        private static SOAPMessage createSOAPRequest(String soapAction) throws Exception {
            MessageFactory messageFactory = MessageFactory.newInstance();
            SOAPMessage soapMessage = messageFactory.createMessage();
    
            createSoapEnvelope(soapMessage);
    
            MimeHeaders headers = soapMessage.getMimeHeaders();
            headers.addHeader("SOAPAction", soapAction);
    
            soapMessage.saveChanges();
    
            /* Print the request message, just for debugging purposes */
            System.out.println("Request SOAP Message:");
            soapMessage.writeTo(System.out);
            System.out.println("\n");
    
            return soapMessage;
        }
    
    }
    

 类似资料:
  • 问题内容: 我正在使用GWT作为Web开发框架。我需要从我的GWT客户端代码访问一些REST服务。我还需要解析JSON(或XML),这是这些服务的响应格式。哪个是解决此问题的最佳方法? 提前致谢。 问题答案: 您可以使用标准GWT调用REST服务(或者如果需要在另一个域上调用服务)。 随着JSON响应字符串,你可以调用获得,它可以是一个,等等,这是在所有可用的这个包。

  • 问题内容: 我有一个使用Python的scikit- learn训练的分类器。如何使用Java程序中的分类器?我可以使用Jython吗?有什么方法可以在Python中保存分类器并在Java中加载分类器?还有其他使用方式吗? 问题答案: 您不能使用jython,因为scikit- learn非常依赖numpy和scipy,它们具有许多已编译的C和Fortran扩展,因此无法在jython中工作。 在

  • 问题内容: 我正在尝试做一个简单的Jform,并从另一个类中调用它。我想在服务器客户端应用程序中使用此Jframe,但是我不知道如何从另一个类打开JFrame类。 就像用户必须选择 1-打开Jframe。 2-退出。 那么我在做什么错呢? 以下是代码: 名为Calculas.java的Jframe类 名为Test.java的测试类 问题答案: 如果这很天真,请原谅我,因为我不是Java程序员的任何

  • 问题内容: 我在Java项目中使用Jython。 我有一个Java类:和一个Python类: Python文件如下: 现在的问题是我想从Java文件的方法调用Python文件的方法并打印结果。 问题答案: 如果我没看错文档,则可以使用以下功能: 或者,如果您想获取字符串: 如果要向其提供Java变量的某些输入,则可以预先使用,而不要在Python代码中使用该变量名:

  • 问题内容: 我在此类的构造函数中有一个noraml java类,说ReceivedChat.java,我想调用Android的Activity。 我的活动课是。 该程序不起作用。它不是在调用我的班级的onCreate。对我有任何帮助。 问题答案: 如何从普通的Java类调用Activity类 您需要在通过活动或任何其他应用程序组件创建对象时,将当前活动上下文传递给: 而不是从Constructor

  • 问题内容: 如何从Java调用GraphViz,以及如何使用Java调用GraphViz函数?为了访问用于构建点图的GraphViz库,必须包含哪些必需的jar文件?是否有用于生成点图的示例程序 问题答案: 检查此 API,它很简单,并且具有几种输出格式(即pdf gif ..etc)。 编辑2016年5月: 许多人评论说该API不再可用;这里是其源代码: 首先,您需要创建并复制以下文件,然后粘贴