web-dev-qa-db-fra.com

Comment appeler un service Web (décrit par un wsdl) à partir de java

Ne connaissant rien aux services Web, j'essaie simplement d'appeler un service "isAlive" décrit par un wsdl.

Cela me semble être quelque chose qui ne devrait pas prendre plus de 2 à 5 lignes de code, mais je n'arrive pas à trouver autre chose que d'énormes longs exemples impliquant des packages tiers, etc.

Quelqu'un a des idées? S'il est toujours supposé être long, une bonne explication des raisons pour lesquelles il doit être si compliqué sera également appréciée. J'utilise Eclipse et le wsdl est SOAP.

23
codekitty

JDK 6 est livré avec jax-ws, tout ce dont vous avez besoin pour développer un client pour un service Web.

Je ne trouve pas d'exemples assez simples à publier, mais commencez par https://jax-ws.dev.Java.net/

Modifier: voici un exemple simple - un client pour ce service 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

Créez PrimeClient.Java qui ressemble à:

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();
    }
  }
} 

Compiler et exécuter:

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
6
nos

Il existe des plugins pour les IDE qui génèrent le code nécessaire pour consommer un service Web pour vous.

Une fois que le plugin vous a généré les méthodes de base, vous appelez simplement un service Web comme celui-ci:

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

Jetez un œil à http://urbas.tk/index.php/2009/02/20/Eclipse-plug-in-as-a-web-service-client/

4
JCasso

Il existe trois façons d'écrire un client de service Web

  1. Proxy dynamique
  2. Interface d'invocation dynamique (DII)
  3. Client d'application

Exemple pour Dynamic Proxy Client

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();
        } 
    } 
}  

J'espère que cela résoudra votre question.

1
Tony