JAVA调用webService 工具类 copy即用

本文介绍了在Java中调用SOAPWebService的方法,包括SOAPWebserviceUtil工具类的使用,以及SOAPClientPojo模型。文章讨论了WebService的优点(如跨平台、基于HTTP的SOAP协议)和缺点(如效率较低),并提供了详细的调用示例。通过创建Dispatch对象,设置请求上下文,以及处理响应消息,实现了与WebService的交互。

前言

最近也不清楚什么情况,项目中需要调用webservice,之前都是调用httpClient,第一次调用,特地记录一下,以便后面使用。原文出处忘了,不过接下来注释绝对尽量让一个初学者也能理解。

webService 的优势与不足

优点:

1 、采用xml支持跨平台远程调用。

2、基于http的soap协议,可跨越防火墙。

(因为SOAP一般使用HTTP协议,而服务器的这个协议一般都是开放的,而且是可以穿过防火墙的)

3、支持面向对象开发。

4、有利于软件和数据重用,实现松耦合。

缺点

由于soap是基于xml传输,本身使用xml传输会传输一些无关的东西从而效率不高,随着soap协议的完善,soap协议增加了许多内容,这样就导致了使用soap协议去完成简单的数据传输的效率不高。如果直接用http传输自定义数据内容比webservice开发更快捷,例如第三方支付公司的支持接口。

说到这我记得我当时问webService 的提供人,为什么不用 httpClient 接口调用方式,他回答的是这个是之前现成的。。。我也很无奈啊

工具类正文

说了那么多废话,还是来点真东西吧

SOAPWebserviceUtil

package com.sf.bpm.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sf.bpm.baseInfo.model.SOAPClientPojo;
import com.sun.xml.internal.ws.client.BindingProviderProperties;

import org.apache.commons.lang3.StringUtils;
import org.dom4j.Attribute;
import org.dom4j.Element;
import org.dom4j.io.DOMReader;
import org.w3c.dom.Document;

import javax.xml.namespace.QName;
import javax.xml.soap.*;
import javax.xml.ws.BindingProvider;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding;
import java.io.ByteArrayOutputStream;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;


public  class SOAPWebserviceUtil {

 private static Dispatch<SOAPMessage> dispatch;
 private static MessageFactory messageFactory;
 
 public static final String SOAP11HTTP_BINDING = "http://schemas.xmlsoap.org/wsdl/soap/http";
 public static final Integer CONNECT_TIMEOUT = 600000;//默认的连接超时时间(毫秒)
 //从connect Manager获取Connection的默认超时时间(毫秒)
 public static final Integer CONNECTION_REQUEST_TIMEOUT = 600000;
 private static Logger log = Logger.getLogger(SOAPWebserviceUtil.class.getName());
 //获取分发对象
 public static void init(SOAPClientPojo clientPojo) {

     String targetNamespace = clientPojo.getTargetNamespace();
     //初始化端口
     QName portQName = new QName(targetNamespace,clientPojo.getPortName());
     //初始化服务端口
     QName serviceQName = new QName(targetNamespace, clientPojo.getServiceName());

     //通过服务名创建服务对象
     Service service = Service.create(serviceQName);
     //向服务上添加一个新的端口
     service.addPort(portQName, SOAP11HTTP_BINDING,clientPojo.getWsdlLocation());
     // 创建一个分发实例Dispatch<SOAPMessage>
     dispatch = service.createDispatch(portQName,SOAPMessage.class,Service.Mode.MESSAGE);

     Map<String,Object> requestContext = dispatch.getRequestContext();

     requestContext.put(BindingProviderProperties.CONNECT_TIMEOUT,CONNECT_TIMEOUT);
     //设置连接时间
     requestContext.put(BindingProviderProperties.REQUEST_TIMEOUT,CONNECTION_REQUEST_TIMEOUT);

     if (StringUtils.isNotBlank(clientPojo.getUserName()) && StringUtils.isNotBlank(clientPojo.getPassword())) {
         requestContext.put(BindingProvider.USERNAME_PROPERTY,clientPojo.getUserName());
         requestContext.put(BindingProvider.PASSWORD_PROPERTY,clientPojo.getPassword());
     }

     SOAPBinding soapBinding = (SOAPBinding) dispatch.getBinding();
     messageFactory = soapBinding.getMessageFactory();
 }


 //调用webService方法,填充内容
 public static JSONObject callWebService(SOAPClientPojo clientPojo,JSON reData) {
     JSONObject result = new JSONObject();
     try {

         init(clientPojo);
         SOAPMessage request = messageFactory.createMessage();

         //创建soap消息主体
         SOAPPart soapPart = request.getSOAPPart();

         SOAPEnvelope soapEnvelope = soapPart.getEnvelope();

         String targetNamespace = clientPojo.getTargetNamespace();
         String prefix = clientPojo.getPrefix();
         String action = clientPojo.getAction();
         //创建命名空间
         soapEnvelope.addNamespaceDeclaration(prefix,targetNamespace);

         //创建消息body内容
         SOAPBody soapBody = soapEnvelope.getBody();
         QName payloadName = new QName(targetNamespace, action, prefix);

         SOAPElement bodyElement = soapBody.addChildElement(payloadName);

         //请求参数
         generateParams(bodyElement,reData);
         //保存消息
         request.saveChanges();

         // 打印客户端发出的soap报文,做验证测试
         ByteArrayOutputStream in = new ByteArrayOutputStream();
         request.writeTo(in);

         //TODO:此处到时候存入数据库
         String message = new String(in.toByteArray());
         log.info("客户端发送内容:" + message);

         //通过Dispatch传递消息,会返回响应消息
         SOAPMessage response = dispatch.invoke(request);
         ByteArrayOutputStream out = new ByteArrayOutputStream();

         response.writeTo(out);
         //TODO:此处到时候存入数据库
         log.info("服务端响应内容:" + new String(out.toByteArray()));

         //处理响应消息,将响应的消息转换为dom对象
         SOAPBody responseBody = response.getSOAPPart().getEnvelope().getBody();
         //org.w3c.dom.
         Document document = responseBody.extractContentAsDocument();

         // org.w3c.dom.装维dom4j
         DOMReader xmlReader = new DOMReader();
         org.dom4j.Document dom = xmlReader.read(document);

         dom4j2Json(dom.getRootElement(), result);
     } catch (Exception e) {
         e.printStackTrace();
     }
     return result;
 }


 private static void generateParams(SOAPElement payload, JSON params) throws SOAPException {
     if (params instanceof JSONObject) {
         JSONObject obj = (JSONObject) params;
         for (String key : obj.keySet()) {
             if (obj.get(key) instanceof JSONObject) {
                 SOAPElement soapElement = payload.addChildElement(key);
                 generateParams(soapElement, (JSON) obj.get(key));
             } else if (obj.get(key) instanceof JSONArray) {
                 JSONArray ary = ((JSONArray) obj.get(key));
                 for (Object ar : ary) {
                     SOAPElement soapElement = payload.addChildElement(key);
                     generateParams(soapElement, (JSON) ar);
                 }
             } else {
                 payload.addChildElement(key).setValue(obj.get(key) == null ? "" : obj.get(key).toString());
             }
         }
     }
     if (params instanceof JSONArray) {
         JSONArray ary = ((JSONArray) params);
         for (Object obj : ary) {
             generateParams(payload, (JSON) obj);
         }
     }
 }

 //将dom4j转为json对象
 private static void dom4j2Json(Element element, JSONObject json) {
     //如果是属性
     for (Object o : element.attributes()) {
         Attribute attr = (Attribute) o;
         if (StringUtils.isNotEmpty(attr.getValue())) {
             json.put("@" + attr.getName(), attr.getValue());
         }
     }
     List<Element> chdEl = element.elements();
     if (chdEl.size() == 0) {
         //如果没有子元素,只有一个值  null值也放入JSON
         log.info(element.getName());
         log.info(element.getText());
         json.put(element.getName(), element.getText());
     } else {
         for (Element e : chdEl) {
             if (!e.elements().isEmpty()) {
                 //子元素也有子元素
                 JSONObject chdjson = new JSONObject();
                 dom4j2Json(e, chdjson);
                 Object o = json.get(e.getName());
                 if (o != null) {
                     JSONArray jsona = null;
                     if (o instanceof JSONObject) {
                         //如果此元素已存在,则转为jsonArray
                         JSONObject jsono = (JSONObject) o;
                         json.remove(e.getName());
                         jsona = new JSONArray();
                         jsona.add(jsono);
                         jsona.add(chdjson);
                     }
                     if (o instanceof JSONArray) {
                         jsona = (JSONArray) o;
                         jsona.add(chdjson);
                     }
                     json.put(e.getName(), jsona);
                 } else {
                     if (!chdjson.isEmpty()) {
                         json.put(e.getName(), chdjson);
                     } else {
                         json.put(e.getName(), null);
                     }
                 }


             } else {
                 //子元素没有子元素
                 for (Object o : element.attributes()) {
                     Attribute attr = (Attribute) o;
                     if (StringUtils.isNotEmpty(attr.getValue())) {
                         json.put("@" + attr.getName(), attr.getValue());
                     }
                 }
                 json.put(e.getName(), e.getText());
             }
         }
     }

 }

}

工具类所需的model

SOAPClientPojo

package com.sf.bpm.baseInfo.model; 
import java.util.Date;


public class SOAPClientPojo {

 private String wsdlLocation;//url地址
 private String targetNamespace;//命名空间  targetNamespace(访问webService找到对应的标签值)
 private String serviceName;  // 找借口提供人获取,或访问webService 查看
 private String portName;     //找port 标签,对应的name
 //private String bindingType;
 private String action;		//operation 标签对应值
 private String prefix;		//前缀 用工具生成的参数查看action 标签前对应的值
 private Date createDate;//创建时间
 private Date modifyDate;//修改时间
 private Integer id;//主键
 private String code;//接口唯一主键
 private String userName;//用户名
 private String password;//密码
 
 
 
 
 
 
 
 
 public String getWsdlLocation() {
 	return wsdlLocation;
 }
 public void setWsdlLocation(String wsdlLocation) {
 	this.wsdlLocation = wsdlLocation;
 }
 public String getTargetNamespace() {
 	return targetNamespace;
 }
 public void setTargetNamespace(String targetNamespace) {
 	this.targetNamespace = targetNamespace;
 }
 public String getServiceName() {
 	return serviceName;
 }
 public void setServiceName(String serviceName) {
 	this.serviceName = serviceName;
 }
 public String getPortName() {
 	return portName;
 }
 public void setPortName(String portName) {
 	this.portName = portName;
 }
 public String getAction() {
 	return action;
 }
 public void setAction(String action) {
 	this.action = action;
 }
 public String getPrefix() {
 	return prefix;
 }
 public void setPrefix(String prefix) {
 	this.prefix = prefix;
 }
 public Date getCreateDate() {
 	return createDate;
 }
 public void setCreateDate(Date createDate) {
 	this.createDate = createDate;
 }
 public Date getModifyDate() {
 	return modifyDate;
 }
 public void setModifyDate(Date modifyDate) {
 	this.modifyDate = modifyDate;
 }
 public Integer getId() {
 	return id;
 }
 public void setId(Integer id) {
 	this.id = id;
 }
 public String getCode() {
 	return code;
 }
 public void setCode(String code) {
 	this.code = code;
 }
 public String getUserName() {
 	return userName;
 }
 public void setUserName(String userName) {
 	this.userName = userName;
 }
 public String getPassword() {
 	return password;
 }
 public void setPassword(String password) {
 	this.password = password;
 }
 
 
 
 
}

到这里其实正文部分就已经结束了,接下看一下调用的示例

调用示例

@Override
 public String pushMsgToPlm(Map map) {
 	logger.info("------------开始向PLM系统推送专利申请信息--------------");
 	String url = PropUtils.getValue("ZLSQ.PLM.URL");
 	String username = PropUtils.getValue("ZLSQ.PLM.USERNAME");
 	String password = PropUtils.getValue("ZLSQ.PLM.PASSWORD");

 	//根据TS_ID 获取需要传入的参数
 	Map patenApplication = getPatentApplication(map.get("TS_ID").toString());
 	List<Map<String , Object>> patentProductList = getPatentProduct(map.get("TS_ID").toString());
 	Map inst = getInst(map.get("TS_ID").toString());
 	List<Map> dataList = getFianlParm(inst,patenApplication,patentProductList);
 	Map resultMap = new HashMap();
 	resultMap.put("url", url);
 	resultMap.put("dataList", dataList);

 	SOAPClientPojo requestPojo = new SOAPClientPojo();
 	requestPojo.setWsdlLocation(url);
 	requestPojo.setTargetNamespace("http://ps.syscong.sfauto.ext/");
 	requestPojo.setServiceName("SFWebServiceInterface");
 	requestPojo.setPortName("SFWebServicePort");
 	requestPojo.setPrefix("ps");
 	requestPojo.setAction("SFWebServiceInterface");
 	requestPojo.setUserName(username);
 	requestPojo.setPassword(password);
 	List resultList = new ArrayList();
 	//专利类型为多个需要调用多次
 	for(Map data : dataList) {
 		JSONObject result = SOAPWebserviceUtil.callWebService(requestPojo, new JSONObject(data));
 		resultList.add(result);
 	}
 	
//		String result = restClient.post(url, data);
 	resultMap.put("result", resultList);
 	logger.info("调用PLM的返回值为"+resultList);
 	
 	logger.info("------------结束向PLM系统推送专利申请信息--------------");
 	return RestResult.data(resultMap);
 }

其实主要就是封装一个model 然后调用就可以了,怎么样很简单吧,当时也算是调了一天才调通。。。本文到这里也就结束了,希望大家元旦快乐!

Java调用 WebService工具类实现方法,通常依赖于使用 Apache Axis、JAX-WS 或其他支持 SOAP 协议的框架。下面介绍一种通用且较为简便的实现方式,通过 `javax.xml.rpc` 和 Apache Axis 提供的功能来构建一个可复用的工具类。 以下是一个基于 `org.apache.axis.client.Call` 和 `org.apache.axis.client.Service` 实现的 WebService 工具类示例: ```java import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.encoding.XMLType; import javax.xml.namespace.QName; import java.util.HashMap; import java.util.Map; public class WebServiceUtil { /** * 调用 WebService 接口并返回结果 * * @param parameters 参数名称数组 * @param parameterValues 参数值数组 * @param methodName 方法名 * @param namespaceURI 命名空间 * @param endpoint 服务地址 * @return 返回调用结果 * @throws Exception 异常处理 */ public static String callWebService(String[] parameters, Object[] parameterValues, String methodName, String namespaceURI, String endpoint) throws Exception { Service service = new Service(); Call call = (Call) service.createCall(); // 设置目标命名空间和操作方法 call.setTargetEndpointAddress(new java.net.URL(endpoint)); call.setOperationName(new QName(namespaceURI, methodName)); call.setNamespaceURI(namespaceURI); // 构建参数映射 Map<String, Object> paramMap = new HashMap<>(); for (int i = 0; i < parameters.length; i++) { paramMap.put(parameters[i], parameterValues[i]); } // 设置参数类型(根据实际情况调整) call.addParameter("parameters", XMLType.XSD_ANYTYPE, javax.xml.rpc.ParameterMode.IN); // 设置返回类型为字符串 call.setReturnType(XMLType.XSD_STRING); // 调用远程方法 String result = (String) call.invoke(new Object[]{paramMap}); return result; } } ``` ### 使用说明 1. **依赖库**:需要引入 Apache Axis 相关 JAR 包,例如 `axis.jar`, `commons-discovery.jar`, `jaxrpc.jar`, `saaj.jar` 等。 2. **调用方式**:如引用 [^1] 所述,可通过定义参数名称与值数组,并指定方法名、命名空间和服务地址进行调用。 3. **参数类型**:可根据实际接口定义调整参数类型,例如使用 `SOAPConstants.SOAP_STRING_TYPE` 等具体类型代替 `XMLType.XSD_ANYTYPE`。 4. **异常处理**:确保对网络连接失败、服务不可用等情况进行捕获和处理。 ### 示例调用代码 ```java public class WebServiceClient { public static void main(String[] args) { try { String[] parameters = {"strJson", "strLoginAccount", "strVerifyCode", "strType"}; Object[] values = {"1989898989", "17627363727", "809809808089800809", "im"}; String namespace = "http://tempuri.org/"; String endpoint = "http://localhost:8060/test.asmx"; String method = "UpdateMoblie"; String result = WebServiceUtil.callWebService(parameters, values, method, namespace, endpoint); System.out.println(result); } catch (Exception e) { e.printStackTrace(); } } } ``` 该工具类实现了基本的 WebService 调用功能,适用于大多数基于 SOAP 的 Web 服务接口[^1]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值