java调用webservice,java调用webservice传递Integer

发布时间:2023-01-04

本文目录一览:

  1. forest调用webservice
  2. java调用webservice
  3. java如何调用webservice接口

forest调用webservice

用java实现web services必须遵循两个规范,他们分别是:

  • JSR 101:用于基于XML的RPC ,Remote Procedure Call、 的Java API 、Java API for XML based RPC, JAX-RPC,
  • JSR 109:实现企业Web服务。Implementing Enterprise Web services。两个规范提供了厂商的实现的一致性和互操作性需求。 JAX-RPC——Java到XML和XML到Java映射API JAX-RPC为基于XML的远程过程调用。Remote Procedure Call、 RPC,和Java应用程序编程接口 、Java Application Programming Interface。 API, 、
  • WSDL到Java和Java到WSDL映射,例如、将WSDL端口类型映射到Java服务端点接口 ,Java Service Endpoint Interface、 SEI。 。
  • XML数据类型到Java数据类型和Java数据类型到XML数据类型映射。包括简单类型、复杂类型和数组。 除了XML映射之外, JAX-RPC还定义了服务器端编程模型和API。 AX-RPC 1. 1根据Web 服务互操作性组织、Web Services Interoperability organization、 WS-I。基本概要版本1.0 、Basic Profile version 1.0,添加了互操作性需求。 JSR 109——J2EE环境的API JSR 109指定了Java 2 Enterprise Edition ,J2EE、环境的Web服务编程模型和体系结构。 JSR 109构建在SOAP 1. 1和WSDL 1. 1的基础上、它涵盖了J2EE环境中JAX-RPC 的使用, 图2, 。它还定义了J2EE应用程序服务器中的部署模型。 JSR 109的客户端编程模型符合JAX-RPC。 JAX-RPC 1. 1和JSR 109是J2EE 1.4的组成部分。 1/7页 在这里我不准备描述用java如何实现服务端,仅描述如何用java作为客户端如何调用web services。 获取客户端服务 Java客户端有两种获取方式、一种是基于容器管理的、一种不是基于容器管理的。基于容器管理的、可以是不同类型的J2EE容器管理的客户机,
  • 应用程序客户机容器客户机
  • Web容器客户机。 JavaBean或Servlet
  • EJB容器客户机、 EJB 他们通过jndi查找服务。一般是两个步骤:
  1. 实例化本地JND I上下文。
  2. 在此上下文中对Web服务进行JND I查找。
Context ic = new InitialContext();
Service service = (Service) ctx.lookup("java:comp/env/service/HelloService");

然后可以使用获得的服务接口 。Service Interface,来获取静态存根、动态代理或DII Call对象,来实现我下面描述的三种调用方式。 不是基于容器管理的、就是在本地通过java程序直接调用服务的,服务查找是通过JAX-RPC ServiceFactory进行的、 JAX-RPC ServiceFactory是创建服务访问点的工厂,可以如下进行使用获取服务。

javax.xml.rpc.Service service = ServiceFactory.newInstance().createService(...);

我在下面描述的客户端获取方式都是基于不是容器管理的。java调用webservices 用java作为客户端调用webservices主要有三种方式,下面描述三种调用方式。

  1. DII (Dynamic Invocation Interface) 调用 复杂度最高。灵活性最强的调用方式 通过自己创建Call对象完成调用,此方法的步骤如下, 2/7页
  2. 获取一个JAX-RPC Service 。
  3. 使用JAX-RPC Service的createCall()方法实例化JAX-RPC Call 。
  4. 使用它的setter方法来配置您的Call实例。
  5. 使用JAX-RPC Call的调用方法来调用Web服务的操作。
String namespace = "";
String portName = "Hello";
QName portQN = new QName(namespace, "portName");
String operationName = "getGreeting";
Call call = service.createCall();
call.setPortTypeName(portQN);
call.setOperationName(new QName(namespace, operationName));
call.setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, "");
call.setProperty(Call.OPERATION_STYLE_PROPERTY, "wrapped");
call.addParameter("param1", xsd:string, ParameterMode.IN);
call.setReturnType(xsd:string);
Object[] inParams = new Object[] {"Jane"};
String ret = (String) call.invoke(inParams);

使用DII Call接口的优势在于,客户机可以调用远程过程而无需知道开发时的WSDL URI或Web服务操作的签名。这样当Web服务的细节改变时、很容易对代码进行修改。使用DII客户机,不需要像动态代理或静态存根的情形那样由从WSDL到Java的映射工具。Emitter,生成运行时类。然而,如果您知道您想要调用的 Web服务不可能更改,就应该使用动态代理。 因为配置Call实例可能很复杂。 我以调用一个axis的webservices为例说明DLL如何调用。 编写服务端程序Hello

package com.lion.service;
public class Hello {
    public String sayHello(String name) {
        return "hello " + name;
    }
}

将上面的程序发布成一个web服务。在web-info\server-config.wsdd文件添加下列描述,

<service name="Hello" provider="java:RPC">
    <parameter name="className" value="com.lion.service.Hello"/>
    <parameter name="allowedMethods" value="sayHello"/>
</service>

客户端调用程序如下TestHelloClient.java,

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;
import java.net.MalformedURLException;
import java.rmi.RemoteException;
public class TestHelloClient {
    public static void main(String[] args) {
        try {
            String endpoint = "http://example.com/axis/Hello.jws";
            Service service = new Service();
            Call call = (Call) service.createCall();
            call.setTargetEndpointAddress(new java.net.URL(endpoint));
            call.setOperationName("sayHello");
            String res = (String) call.invoke(new Object[] {"lion"});
            System.out.println("return value is " + res);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

3/7页 2. 使用动态代理 (Dynamic Proxy) 调用 复杂度中等、灵活性中等的调用方式 您可以使用代理从JAX-RPC Service中调用Web服务的操作。代理是实现SEI (服务端点接口 Service Endpoint Interface)的Java类。获得代理使用的是JAX-RPC Service 的getPort()方法,它接受您想要调用的Web服务的端口的名称,存在于WSDL文档中。以及代理实现的SEI。它之所以称为动态是因为该代理是在运行时创建的。动态代理客户机的步骤如下、

  1. 获取一个JAX-RPC Service 。
  2. 使用JAX-RPC Service的getPort()方法来获得一个代理以调用Web服务的操作。
String namespace = "";
String portName = "Hello";
QName portQN = new QName(namespace, portName);
Hello myProxy = service.getPort(portQN, Hello.class);
System.out.println(myProxy.getGreeting("Jane"));

这是所有您为了使用动态代理方法调用Web服务而需要编写的代码。使用这种方法的优势在于您可以编写可移植的、厂商无关的代码。然而、您需要知道开发时的WSDL URL、并且需要在运行之前根据WSDL文档运行您的从WSDL到Java的映射工具。如果您没有这方面的信息,或者WSDL URL很可能改变、那么您应该改为使用DII方法。 仍以上面发布的hello服务为例子。下面是动态代理的调用代码。 编写客户端代理接口

//这里声明的方法一定要和服务端程序的方法名称和参数相同。最好类名也一样
//而且必须继承java.rmi.Remote接口
public interface HelloClientInterface extends java.rmi.Remote {
    public String sayHello(String name) throws java.rmi.RemoteException;
}

编写并执行客户端程序TestHelloClient.java

import javax.xml.rpc.Service;
import javax.xml.rpc.ServiceFactory;
import java.net.URL;
import javax.xml.namespace.QName;
public class TestHelloClient {
    public static void main(String[] args) {
        try {
            String wsdlUrl = "http://example.com/axis/Hello.wsdl";
            String nameSpaceUri = "http://example.com/axis/";
            String serviceName = "HelloService";
            String portName = "Hello";
            ServiceFactory serviceFactory = ServiceFactory.newInstance();
            Service afService = serviceFactory.createService(new URL(wsdlUrl), new QName(nameSpaceUri, serviceName));
            HelloClientInterface proxy = (HelloClientInterface) afService.getPort(new QName(nameSpaceUri, portName), HelloClientInterface.class);
            System.out.println("return value is " + proxy.sayHello("lion"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

java调用webservice

String endpoint = "";
String id = "11111";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new URL(endpoint));
call.setOperationName("webservice方法名");
String res = (String) call.invoke(new Object[] {id});

看了你的描述觉得你把webservice想得太复杂化了,其实就是一个jar包和几个类。 以上就是最简单的webservice客户端用法,和反射有点像。当然返回值不一定是String,返回的类型和格式要问服务提供方。 我用的是axis的,我不了解websphere什么的,但是webservice就是那么易用的东西。 请采纳。

java如何调用webservice接口

Java调用WebService可以直接使用Apache提供的axis.jar自己编写代码,或者利用Eclipse自动生成WebService Client代码,利用其中的Proxy类进行调用。理论上是一样的,只不过用Eclipse自动生成代码省事些。

  1. 编写代码方式:
package com.yudun.test;
import java.rmi.RemoteException;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.PrefixedQName;
import org.apache.axis.message.SOAPHeaderElement;
import com.cezanne.golden.user.Exception;
import com.cezanne.golden.user.UserManagerServiceProxy;
import javax.xml.namespace.QName;
import java.net.MalformedURLException;
import javax.xml.rpc.ServiceException;
import javax.xml.soap.Name;
import javax.xml.soap.SOAPException;
public class testWebService {
    public static String getResult() throws ServiceException, MalformedURLException, RemoteException, SOAPException {
        //标识Web Service的具体路径
        String endpoint = "WebService服务地址";
        // 创建 Service实例
        Service service = new Service();
        // 通过Service实例创建Call的实例
        Call call = (Call) service.createCall();
        //将Web Service的服务路径加入到call实例之中.
        call.setTargetEndpointAddress( new java.net.URL(endpoint) );
        //由于需要认证,故需要设置调用的SOAP头信息。
        Name headerName = new PrefixedQName( new QName("发布的wsdl里的targetNamespace里的url", "string_itemName") );
        org.apache.axis.message.SOAPHeaderElement header = new SOAPHeaderElement(headerName);
        header.addTextNode( "blablabla" );
        call.addHeader(header);
        org.apache.axis.description.OperationDesc oper;
        org.apache.axis.description.ParameterDesc param;
        oper = new org.apache.axis.description.OperationDesc();
        oper.setName("opName");
        param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg0"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("", "string"), java.lang.String.class, false, false);
        param.setOmittable(true);
        oper.addParameter(param);
        param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg1"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("", "string"), java.lang.String.class, false, false);
        param.setOmittable(true);
        oper.addParameter(param);
        param = new org.apache.axis.description.ParameterDesc(new javax.xml.namespace.QName("", "arg2"), org.apache.axis.description.ParameterDesc.IN, new javax.xml.namespace.QName("", "string"), java.lang.String.class, false, false);
        param.setOmittable(true);
        oper.addParameter(param);
        oper.setReturnType(new javax.xml.namespace.QName("", "string"));
        oper.setReturnClass(java.lang.String.class);
        oper.setReturnQName(new javax.xml.namespace.QName("", "return"));
        oper.setStyle(org.apache.axis.constants.Style.WRAPPED);
        oper.setUse(org.apache.axis.constants.Use.LITERAL);
        oper.addFault(new org.apache.axis.description.FaultDesc(
            new javax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url", "Exception"),
            "Exception",
            new javax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url", "Exception"),
            true
        ));
        call.setOperation( oper );
        call.setOperationName(new javax.xml.namespace.QName("发布的wsdl里的targetNamespace里的url", "opName"));
        //调用Web Service,传入参数
        String res = ( String ) call.invoke( new Object[]{"arg0","arg1"} );
        System.out.println("===============");
        return res;
    }
    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            System.out.println(getResult());
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (ServiceException e) {
            e.printStackTrace();
        } catch (SOAPException e) {
            e.printStackTrace();
        }
    }
}
  1. 利用Eclipse自动生成WebService client代码就容易多了:(由于还不会发图片,就用语言描述了,大家酬和看吧。。。) 首先,new project,选择other,在输入框中输入Web Service Client,选中搜索后的结果,点击Next,在Service definition中输入 WebService的发布地址,点击Finish 这样,WebService Client代码已经生成好了。 接下来写一个Test类,在main函数中输入如下代码:
String endpoint = "服务器的WebService的地址";
YourWebServiceNameProxy umsp = new YourWebServiceNameProxy(endpoint);
try {
    String resultStr = umsp.opMethod("arg0","arg1");
    System.out.println(resultStr);
} catch (Exception e) {
    System.out.println("异常");
    e.printStackTrace();
} catch (RemoteException e) {
    System.out.println("RemoteException异常");
    e.printStackTrace();
}

如果还有疑问的话还有视频,如果对你有帮助请采纳!