Java请求webservice踩过的坑

最近项目对接过程中,因为对方系统比较旧,我们和对方进行交互使用webservice方式进行,对方给出相关文档,

接口地址:http://ip:port/abc/def/xxxService?wsdl

接口名称:methodA

1-springboot配合CXF使用

由于接口的ip是内网地址,我们业务服务器出去,我们必须中转到一台可以打通内网ip的机器A上才能请求。首先我们使用内网穿透工具(ngfork),在A上部署一个中转应用。

大概流程如下:

Java请求webservice踩过的坑_第1张图片

 

Java核心代码如下:

pom引入依赖

  
        org.springframework.boot
        spring-boot-starter-parent
        2.3.1.RELEASE
        
    



        
            org.projectlombok
            lombok
            1.16.18
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
            org.springframework.boot
            spring-boot-starter-web
        

        
            org.apache.commons
            commons-lang3
            3.8
        

        
        
            com.sun.xml.ws
            jaxws-ri
            2.3.3
            pom
        

        
        
            org.hibernate.validator
            hibernate-validator
            6.2.0.Final
        

        
        
            org.springframework.boot
            spring-boot-starter-web-services
        

        
        
            org.apache.cxf
            cxf-spring-boot-starter-jaxws
            3.4.3
        

        
        
            org.apache.cxf
            cxf-rt-transports-http
            3.4.3
        


        
            com.alibaba
            fastjson
            2.0.30
        


    

核心java代码如下:

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("接口地址");
Object[] objects = client.invoke("接口名称", reqStr);

objects就是对方返回的结果。

这种情况直接使用ip,完全没有问题,如下使用域名会出现如下错误:

org.apache.cxf.interceptor.Fault: Response was of unexpected text/html ContentType.  Incoming portion of HTML stream:
301 Moved Permanently

301 Moved Permanently



nginx/1.22.1


 

2-使用AXIS请求

上面使用frps进行时,使用域名会出现以上错误,我们更换一种请求方式,就可以获取到结果。方式二直接需要一台公网服务器部署frps,需要域名;然后在中转机上不是frpc客户端,配置相关内容,不需要部署一个服务,直接域名穿透过去。

pom依赖:

 
            org.apache.axis
            axis
            1.4
        
        
            org.apache.axis
            axis-jaxrpc
            1.4
        

        
            commons-logging
            commons-logging
            1.2
        

        
            commons-discovery
            commons-discovery
            0.5
        

        
            wsdl4j
            wsdl4j
            1.5.2
        

核心java代码:

//服务地址
        String url = "https://xxx.com/abc/def/xxxService?wsdl";
        //命名空间
        String namespaceURI = XMLConstants.NULL_NS_URI;
        //方法名
        String method = "yourMethod";
        try {
            Service service = new Service();
            Call call = (Call) service.createCall();
            call.setTargetEndpointAddress(url);
            //设置要调用的方法
            call.setOperationName(new QName(namespaceURI, method));
            //设置要返回的数据类型
            call.setReturnType(new QName(namespaceURI, method), String.class);
            call.setUseSOAPAction(true);
            call.setSOAPActionURI(namespaceURI + method);
            //设置入参
            call.addParameter(new QName(namespaceURI, "params"), Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);

            //调用方法并传递参数
            String resultStr = (String) call.invoke(new Object[]{"{\"name\":\"zhangsan\",\"pwd\":\"abc123456\"}"});
            System.out.println("服务调用结果:" + resultStr);
        } catch (Exception e) {
            e.printStackTrace();
        }

使用方式二就没有出现方式一的301错误。问题解决。

你可能感兴趣的:(#,Java小实战,java,开发语言,webservice)