摘要:
多程式設計語言之間互相調用的情況很常見,這裡是一則Java調用C#程式編寫的WebService示例.
環境:
JAVA: Eclipse Kepler Service Release 1
引用類庫:Axis1.0、Log4J
以下為MetaInfo.
Class-Path:
lib/axis.jar
lib/jaxrpc.jar
lib/mail.jar
lib/saaj.jar
lib/wsdl4j-1.5.1.jar
lib/commons-discovery-0.2.jar
lib/commons-logging-1.0.4.jar
lib/dom4j-1.6.1.jar
lib/jaxen-1.1.1.jar
lib/log4j-1.2.13.jar
lib/slf4j-api-1.5.2.jar
lib/slf4j-nop-1.5.2.jar
關鍵點:
1.call.setOperationName必須做QName轉化(命名空間NameSpace識别用);
2.call.addParameter一定不能用QName轉化,如果做過轉化,會導緻WebService無法識别入口參數;
3.call.setUseSOAPAction(true);
call.setSOAPActionURI(wsdl_Qname + method);
詳細說明:
通過WSDL檔案,解讀入口參數、傳回類型等.
比如c#Webservice提供一個 UpdateCheckItemsState 過程,在wsdl中:
- <wsdl:message name="UpdateCheckItemsStateSoapIn">
<wsdl:part name="patient_id" type="s:string" />
</wsdl:message>
- <wsdl:message name="UpdateCheckItemsStateSoapOut">
<wsdl:part name="UpdateCheckItemsStateResult" type="s:boolean" />
</wsdl:message>
裡面就是入口參數和傳回結果,分别是String和Boolean型.
以下為示例代碼:
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;
import org.apache.log4j.Logger;
// 狀态更新
private void UpdateCheckItemsState () {
// 讀取wsdl
remoteUrl = "http://192.168.0.199/WsPacsTrans.asmx?wsdl";
if ((remoteUrl == null) || (remoteUrl.isEmpty())) {
System.out.println("remotewsdl為空");
return;
}
try {
Service myservice = new Service();
Call call = (Call) myservice .createCall();
call.setEncodingStyle(null);
call.setProperty(org.apache.axis.client.Call.SEND_TYPE_ATTR,
Boolean.FALSE);
call.setProperty(org.apache.axis.AxisEngine.PROP_DOMULTIREFS,
Boolean.FALSE);
call.setSOAPVersion(org.apache.axis.soap.SOAPConstants.SOAP11_CONSTANTS);
String wsdl_Qname = "";
String method = "UpdateCheckItemsState";
wsdl_Qname = "http://www.yourname.com/";//此處用wsdl實際的NameSpace名稱
// setOperationName 必須做QName轉化
call.setOperationName(new QName(wsdl_Qname, method));
// 入口參數- patient_id,此處不能做QName轉化處理
call.addParameter("patient_id",
XMLType.XSD_STRING, ParameterMode.IN);
// 傳回參數
call.setReturnType(XMLType.XSD_BOOLEAN);
call.setUseSOAPAction(true);
call.setSOAPActionURI(wsdl_Qname + method);
call.setTargetEndpointAddress(new URL(remoteUrl));
boolean result = (boolean) call.invoke(new Object[] { "12342234" });// 12342234 為測試值,實際運作時傳遞需要的值
log.info("狀态更新結果:" + result);
} catch (Exception e) {
e.printStackTrace();
log.error("狀态更新出錯:" + e.toString());
}
}
後記:
1.注意類庫的版本,如果出現莫名其妙的問題,首先要分析這個原因;
2.其它調試要點歡迎大家分享、補充。
轉載于:https://my.oschina.net/yilaoyu/blog/700123