Java直接AXIS调用远程WebService

最近项目中需要BPM系统远程调用MESS接口(WebService类型),特此记录资料如下。

一、WebService简介

Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件或硬件, 就可相互交换数据或集成。依据Web Service规范实施的应用之间, 无论它们所使用的语言、 平台或内部协议是什么, 都可以相互交换数据。

简单的说,WebService就是一种跨编程语言和跨操作系统平台的远程调用技术。所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然。跨操作系统平台则是指服务端程序和客户端程序可以在不同的操作系统上运行。 远程调用,就是一台计算机的应用可以调用其他计算机上的应用。例如:支付宝,支付宝并没有银行卡等数据,它只是去调用银行提供的接口来获得数据。还有天气预报等,也是气象局把自己的系统服务以webservice服务的形式暴露出来,让第三方网站和程序可以调用这些服务功能。

二、WebService原理

XML,SOAP和WSDL就是构成WebService平台的三大技术

WebService采用Http协议来在客户端和服务端之间传输数据。WebService使用XML来封装数据,XML主要的优点在于它是跨平台的。

WebService通过HTTP协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议规定的。

WebService服务器端首先要通过一个WSDL文件来说明自己有什么服务可以对外调用。简单的说,WSDL就像是一个说明书,用于描述WebService及其方法、参数和返回值。 WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它。客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,以便被人查找;2.直接告诉给客户端调用者。

WebService交互的过程就是:WebService遵循SOAP协议通过XML封装数据,然后由Http协议来传输数据。

三、应用实例

1.前端通过ajax调用后端逻辑。

var rowdata = [];
$("#dynamicRowsIdParticipation2 tbody tr").each(function() {  
      var json = {};         
	  var FI0005_ZVERSION = $("#FI0005_ZVERSION").val();
	  var FI0005_MAKTX =$(this).find("input[name^=FI0005_MAKTX]").val();
      var FI0005_MEINS =$(this).find("input[name^=FI0005_MEINS]").val();   
	  json.FI0005_ZVERSION = FI0005_ZVERSION;
	  json.FI0005_MAKTX = FI0005_MAKTX;
	  json.FI0005_MEINS = FI0005_MEINS;
	  rowdata.push(json);
 });
/*rowdata数据格式类型如下
var rowdata = "[{
	"FI0005_ZVERSION": "A",
	"FI0005_MAKTX": "KTS29001-IPH-LA-0097支架定位底座-A",
	"FI0005_MEINS": "PCS"
}, {
	"FI0005_ZVERSION": "B",
	"FI0005_MAKTX": "KTS29002-IPH-LA-0098支架定位底座-B",
	"FI0005_MEINS": "PCS"
}]";
*/
$.ajax({  
			type : "post",  
			async:false,
			url  :"http://***.aactest001.com/fi0005/operation/createOrder.xsp",  
			data : {
				rowData:JSON.stringify(rowData:JSON)
			},  
			async: false,  
			success : function(data){
				if(data.result){
					flag = true;
				}else{
					msg = "创建MES订单异常";
				}
			},
			error:function(){
				msg = "系统异常,请稍后重试";
			}
		});

2.后台代码
createOrder方法

@RequestMapping("/createOrder")
@ResponseBody
public Map<String, Object> createOrder(String modlerArea,String docId,String rowData,String isWriteSAP,String isWriteMES) {
	Map<String, Object> result = new HashMap<String, Object>();
	String serverName = "http://1**.***.**.**:10030/services/getService?wsdl";
	JSONArray rows = new JSONArray(rowData);
	JSONArray mesData = new JSONArray();
	for(int i=0;i<rows.length();i++){
		JSONObject row = rows.optJSONObject(i);
		JSONObject json = new JSONObject();
		json.put("version", row.optString("FI0005_ZVERSION"));
		json.put("maktx", row.optString("FI0005_MAKTX"));
		json.put("meins", row.optString("FI0005_MEINS"));
		mesData.put(json);
	}
	
	Map<String, Object> mesMap = sendDataToMES.getData(serverName, mesData.toString());
				
	result.put("result", mesMap.get("result"));
	result.put("msg", mesMap.get("msg"));
	return result; 
}

sendDataToMES方法

package com.portal.webservice;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import javax.xml.rpc.ParameterMode;
import org.apache.axis.client.Service;
import org.apache.axis.client.Call;  
import org.apache.axis.encoding.XMLType;
public class sendDataToMES {

	public static Map<String, Object>  getData(String server,String temp) {
		// TODO Auto-generated method stub
		 Map<String, Object> result = new HashMap<String, Object>();
		 try {  
	            String endpoint = server;  
	            //实例化访问对象  
	            Service service = new Service();  
	            //实例化调用对象
	            Call call = (Call) service.createCall();  
	            call.setTargetEndpointAddress(endpoint);
	            call.setOperationName(new QName("http://jdk.study.hermit.org/client", "SendBOMInfoToMoldMes"));// WSDL里面描述的接口名称  
				//设置入参,第一个参数是命名空间以及参数名,这两个参数是采用一	个Qname变量打包传入的,第二个参数是入参的类型(字符或者数字)第三个参数是入参种类
				//“IN”的含义代表入参	
                call.addParameter("bomJsonStr",XMLType.XSD_STRING,ParameterMode.IN);
				// 接口的参数  
	            call.setReturnType(XMLType.XSD_STRING);// 设置返回类型  
 				//调用,入参temp值,并且将返回值转换为String类型
	            String data = (String) call.invoke(new Object[] { temp });  
	            result.put("result", true);
	            result.put("data", data);
		    } catch Exception e) {  
	        	e.printStackTrace();
	        	 result.put("result", false);
	        	 result.put("msg", e);
	        }  
		 return result;
	}
}

参考资料
https://www.cnblogs.com/Sabasdian/p/JavaAndWebservice_4.html
https://blog.csdn.net/c99463904/article/details/76018436
https://www.cnblogs.com/lijianda/p/9811582.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值