本文目錄一覽:
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.DLL 、Dynamic Invocation Interface,調用
複雜度最高。靈活性最強的調用方式
通過自己創建Call對象完成調用,此方法的步驟如下,
2/7頁
1. 獲取一個JAX-RPC Service 。
2. 使用JAX-RPC Service的createCall ()方法實例化JAX-RPC Call 。
3. 使用它的setter方法來配置您的Call實例。
4. 使用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, operatio”n”Name) ) ;call. setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, ) ;call. setProperty(Ca”ll.OPER”ATION_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=”Hel”lo” provide”r=”java”:RPC”
parameter name= className value= com. lion. service .Hello”/
parameter name=”allowedMethods” value=” sayHello “/
/service
客戶端調用程序如下TestHelloClient. java,import org.apache.axis.client.Call ;
3/7頁
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 = ” “;
Service service = new Service() ;
Call call = null;call = (Call) service.createCall () ;call. setTargetEndpointAddress(new java.net.URL(endpoint) ) ;
//為Call設置服務的位置call. setOperationName( “sayHello” ) ;
String res = (String)” call. invoke(new”Object[] {“lion”} ) ;
System.out.println( return value is + res) ;
} catch (Exception ex) {ex.printStackTrace() ;
}
}
}
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) ;
4/7頁
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 = ” “;//wsdl描述
String nameSpaceUri = ” “;//wsdl描述裡面的服務命名空間
String serviceName = “HelloService”;// wsdl描述裡面發布的服務名稱
String portName = “Hello”;//wsdl描述裡面面發布的服務裡面的port名稱
ServiceFactory serviceFactory = ServiceFactory.newInstance() ;
Service afService = serviceFactory.createService(new URL(wsdlUrl) ,new QName(nameSpaceUri, serviceName) ) ;
HelloClientInterface proxy = (HelloClientInterface)afService.getPort(new QName(nameSpaceUr”i, portName) , Hel”loClientInterface.”clas”s) ;
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) );//為Call設置服務的位置
// 由於需要認證,故需要設置調用的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);
// SOAPHeaderElement soapHeaderElement = new SOAPHeaderElement(“發布的wsdl里的targetNamespace里的url”, “SoapHeader”);
// soapHeaderElement.setNamespaceURI(“發布的wsdl里的targetNamespace里的url”);
// try
// {
// soapHeaderElement.addChildElement(“string_itemName”).setValue(“blablabla”);
// }
// catch (SOAPException e)
// {
// e.printStackTrace();
// }
// call.addHeader(soapHeaderElement);
//調用Web Service的方法
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();
}
}
}
2、利用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();
}
如果還有疑問的話還有視頻,如果對你有幫助請採納!
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/251019.html