springboot1.x调用webservice小记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jiangxinjiang2003/article/details/83213824

因工作需要调用webservice接口,不想直接生成类,直接通过相关JAR包调用webservice接口,目前尝试过以下几种方式:

一、axis方式(现在系统在用)

maven外用包:

<dependency>
    <groupId>org.apache.axis</groupId>
    <artifactId>axis</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>axis</groupId>
    <artifactId>axis-jaxrpc</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>wsdl4j</groupId>
    <artifactId>wsdl4j</artifactId>
    <version>1.6.2</version>
</dependency>
<dependency>
    <groupId>commons-discovery</groupId>
    <artifactId>commons-discovery</artifactId>
    <version>0.5</version>
</dependency>

如果使用日志包,则要在maven排除

<exclusions>
              <exclusion> 
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
              </exclusion>
              <exclusion> 
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
              </exclusion>
            </exclusions> 

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.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

@org.springframework.stereotype.Service
public class WebService {

    public static void main(String[] args) {
		try {

			String endpoint = "WEBSERVICE_URL";//配置要请求的WEBSERVICE_URL
			Service service = new Service();
			Call call = (Call) service.createCall();
			call.setTargetEndpointAddress(endpoint);
			// WSDL里面描述的接口名称(要调用的方法)
			call.setOperationName("接口方法");

			// call.setEncodingStyle(namespaceURI);
			// 接口方法的参数名, 参数类型,参数模式 IN(输入), OUT(输出) or INOUT(输入输出)
			call.addParameter("参数名", XMLType.XSD_STRING, ParameterMode.IN);
			call.addParameter("参数名", XMLType.XSD_STRING, ParameterMode.IN);
			call.addParameter("参数名", XMLType.XSD_STRING, ParameterMode.IN);
			call.addParameter("参数名", XMLType.XSD_STRING, ParameterMode.IN);
			call.addParameter("参数名", XMLType.XSD_STRING, ParameterMode.IN);
			call.addParameter("参数名", XMLType.XSD_STRING, ParameterMode.IN);

			// 设置被调用方法的返回值类型
			call.setReturnType(XMLType.XSD_SCHEMA);

			// 设置方法中参数的值
			Object[] paramValues = new Object[] { "****","*****", "****",
					"****", "*****", "***" };

			// 解析返回结果
			call.invoke(paramValues);

			String resultXML = call.getResponseMessage().getSOAPPartAsString();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}

二、axis2调用方法

此方法在本地IDEA和eclipse测试开发运行正常,但部署后会与springboot1.x中tomcat启动冲突,目前没有找到解决方法。

maven引用:

<dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-adb</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>org.apache.axis2</groupId>
            <artifactId>axis2-kernel</artifactId>
            <version>1.4</version>
        </dependency>

注意:也需要排除日志引用

public Map<String, String> toUser(Map<String, String> map) {

		Map<String, String> resultMap = new HashMap<String, String>();

		try {
			

			Options options = new Options();
			// 指定调用WebService的URL
			EndpointReference targetEPR = new EndpointReference("************");
			options.setTo(targetEPR);
			// options.setAction("urn:getPrice");

			ServiceClient sender = new ServiceClient();
			sender.setOptions(options);

			OMFactory fac = OMAbstractFactory.getOMFactory();
			String tns = "NL";
			// 命名空间,有时命名空间不增加没事,不过最好加上,因为有时有事
			OMNamespace omNs = fac.createOMNamespace(tns, "");

            //调用的接口方法名
			OMElement method = fac.createOMElement("tranfer", omNs);

            //方法对应参数名
			OMElement merchant_id = fac.createOMElement("merchant_id", omNs);
			
			merchant_id.addChild(fac.createOMText(merchant_id, "****"));
			method.addChild(merchant_id);

			method.build();

			OMElement result = sender.sendReceive(method);

			resultMap = XMLUtil.strXmlToMap(result.toString());

			// resultMap.put("resultStatus", statusMap.get("result"));

			resultMap.put("resultXML", result.toString());

			 System.out.println(result);

			// System.out.println(XMLUtil.doXMLParse(result.toString()));

			return resultMap;

		} catch (AxisFault axisFault) {
			axisFault.printStackTrace();

			resultMap.put("response_code", "-99");
			resultMap.put("resultXML", "request error");
		} catch (Exception e) {
			e.printStackTrace();

			resultMap.put("response_code", "-99");
			resultMap.put("resultXML", "request error");
		}

		return resultMap;
	}

三、cxf 调用web service 方式

maven引用:

<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-core</artifactId>
    <version>3.2.4</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-bindings-soap</artifactId>
    <version>3.2.4</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-databinding-jaxb</artifactId>
    <version>3.2.4</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-jaxws</artifactId>
    <version>3.2.4</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-frontend-simple</artifactId>
    <version>3.2.4</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-http</artifactId>
    <version>3.2.4</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-transports-udp</artifactId>
    <version>3.2.4</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-ws-addr</artifactId>
    <version>3.2.4</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-wsdl</artifactId>
    <version>3.2.4</version>
</dependency>
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-rt-ws-policy</artifactId>
    <version>3.2.4</version>
</dependency>
<dependency>
    <groupId>org.apache.neethi</groupId>
    <artifactId>neethi</artifactId>
    <version>3.1.1</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
</dependency>
<dependency>
    <groupId>org.apache.ws.xmlschema</groupId>
    <artifactId>xmlschema-core</artifactId>
    <version>2.2.1</version>
</dependency>
<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.27</version>
</dependency>

JAVA代码:主要是返回值没有找到相关方法全部获取

public static void main(String[] args) {
		// 创建动态客户端
		JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
		Client client = dcf.createClient("https://********?wsdl");
		// 需要密码的情况需要加上用户名和密码
		// client.getOutInterceptors().add(new ClientLoginInterceptor(USER_NAME,
		// PASS_WORD));
		Object[] objects = new Object[0];
		try {
			// invoke("方法名",参数1,参数2,参数3....);
			objects = client.invoke("getInfo", "Leftso");
			System.out.println("返回数据:" + objects[0]);
		} catch (java.lang.Exception e) {
			e.printStackTrace();
		}
	}

四、xfire 调用web service

打包后,执行前需要将spring 1.X.jar删除

参考:https://www.2cto.com/kf/201606/515737.html

猜你喜欢

转载自blog.csdn.net/jiangxinjiang2003/article/details/83213824