代码之家  ›  专栏  ›  技术社区  ›  codekitty

如何从Java调用Web服务(由WSDL描述)

  •  23
  • codekitty  · 技术社区  · 15 年前

    我对web服务一无所知,只是想调用一些由wsdl描述的“isalive”服务。

    在我看来,这看起来应该不超过2-5行代码,但我似乎找不到任何东西,除了涉及第三方软件包等巨大的长例子。

    有人有什么想法吗?如果它总是被认为是长的,也许一个很好的解释,为什么它必须如此复杂,也会得到赞赏。 我使用的是eclipse,wsdl是soap。

    4 回复  |  直到 7 年前
        1
  •  6
  •   nos    15 年前

    jdk 6附带jax-ws,这是为web服务开发客户机所需的一切。

    我找不到一些足够简单的例子,但是从 https://jax-ws.dev.java.net/

    编辑:下面是一个简单的示例-此Web服务的客户端: http://xmethods.com/ve2/ViewListing.po?key=427565

    C:\temp> md generated
    C:\temp>"c:\Program Files\Java\jdk1.6.0_17"\bin\wsimport -keep -d generated http://www50.brinkster.com/vbfacileinpt/np.asmx?wsdl
    

    创建primeclient.java,如下所示:

    import javax.xml.ws.WebServiceRef;
    import com.microsoft.webservices.*; 
    //the above namespace is from the generated code from the wsdl. 
    
    public class PrimeClient {
     //Cant  get this to work.. @WebServiceRef(wsdlLocation="http://www50.brinkster.com/vbfacileinpt/np.asmx?wsdl")
      static PrimeNumbers service;
    
      public static void main(String[] args) {
        try {
        service = new PrimeNumbers();
          PrimeClient client = new PrimeClient();
          client.doTest(args);
        } catch(Exception e) {
          e.printStackTrace();
        }
      }
    
      public void doTest(String[] args) {
        try {
          System.out.println("Retrieving the port from the following service: " + service);
          PrimeNumbersSoap pm = service.getPrimeNumbersSoap();
          System.out.println("Invoking the getPrimeNumbersSoap operation ");
          System.out.println(pm.getPrimeNumbers(100));
        } catch(Exception e) {
          e.printStackTrace();
        }
      }
    } 
    

    编译并运行:

    C:\temp>"c:\Program Files\Java\jdk1.6.0_17"\bin\javac -cp generated PrimeClient.java
    C:\temp>"c:\Program Files\Java\jdk1.6.0_17"\bin\java -cp .;generated PrimeClient
    Retrieving the port from the following service: com.microsoft.webservices.PrimeN
    umbers@19b5393
    Invoking the getPrimeNumbersSoap operation
    1,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97
    
        2
  •  4
  •   JCasso    15 年前

    IDE的插件可以生成所需的代码来为您使用Web服务。

    插件生成基本方法后,只需调用如下Web服务:

    TransportServiceSoap service = new TransportServiceLocator().getTransportServiceSoap();
    service.getCities();
    

    看一看 http://urbas.tk/index.php/2009/02/20/eclipse-plug-in-as-a-web-service-client/

        3
  •  1
  •   BurninatorDor    13 年前

    There are three ways to write a web service client

    1. 动态代理
    2. 动态调用接口(DII)
    3. 应用程序客户端

    动态代理客户端示例

    import java.net.URL;
    
    import javax.xml.rpc.Service;
    
    import javax.xml.rpc.JAXRPCException;
    
    import javax.xml.namespace.QName;
    
    import javax.xml.rpc.ServiceFactory;
    
    import dynamicproxy.HelloIF;
    
    public class HelloClient {
    
        public static void main(String[] args) {
            try {
    
                String UrlString = "Your WSDL URL";  // 
                String nameSpaceUri = "urn:Foo";
                String serviceName = "MyHelloService";
                String portName = "HelloIFPort";
    
                System.out.println("UrlString = " + UrlString);
                URL helloWsdlUrl = new URL(UrlString);
    
                ServiceFactory serviceFactory =
                    ServiceFactory.newInstance();
    
                Service helloService =
                    serviceFactory.createService(helloWsdlUrl, 
                    new QName(nameSpaceUri, serviceName));
    
                dynamicproxy.HelloIF myProxy = 
                    (dynamicproxy.HelloIF) 
                    helloService.getPort(
                    new QName(nameSpaceUri, portName), 
                    dynamicproxy.HelloIF.class); 
    
                System.out.println(myProxy.sayHello("Buzz"));
    
            } catch (Exception ex) {
                ex.printStackTrace();
            } 
        } 
    }  
    

    I hope , this would solve your question.

        4
  •  -2
  •   Thorbjørn Ravn Andersen    15 年前

    到目前为止,我发现的最简单的想法是IntLyJ向导,它使用Metro库生成一个非常小的代码片段,它可以用Java 6进行工作。