webservice调用

JDK1.6之后内置了webservice,可以直接用注解使用@Webservice

生成服务端代码的方式

一共有三种方式, 1. 视图方式, 2 . 标准方法, 3 . cxf调用

一 . 发布服务

1 . 对外服务接口代码

package com.test.service;

import com.test.client.GetMobileCodeInfo;

import javax.jws.WebService;


@WebService
public interface webserviceTestClient {
    /**
     * 对外服务接口
     * @param RegID      机构ID
     * @param SendID    发送编号
     * @param LogType   类型
     * @param Logs      日志记录
     * @return
     */
    public String AcceptLogs(String RegID, String SendID, String LogType, String Logs);
}

2 . 对外服务接口实现类代码

package com.test.service;

import javax.jws.WebService;

@WebService
public class WebServiceITestmpl implements webserviceTestClient {
    @Override
    /**
     * 对外服务接口  实现类
     * @param RegID      机构ID
     * @param SendID    发送编号
     * @param LogType   类型
     * @param Logs      日志记录
     * @return
     */
    public String AcceptLogs(String RegID, String SendID, String LogType, String Logs) {
        System.out.println(RegID);
        System.out.println(SendID);
        System.out.println(LogType);
        System.out.println(Logs);
        return "success!";
    }
}

3 . 启动服务发布

package com.test.service;

import javax.xml.ws.Endpoint;

public class TestPublist {
    public static void main(String[] args) {
        /**
         * 对外发布服务
         *  参数一:  address 能访问到的路径就行
         *  参数二:  实现类对象
         */
        Endpoint.publish("http://localhost:8888/ws", new WebServiceITestmpl());
    }
}

4 . 发布成功

服务发布成功之后,服务一直处于监听状态

可以通过浏览器访问 : http://localhost:8888/ws?wsdl 默认地址加上 ?wsdl 发布成功会显示wsdl说明文档
在这里插入图片描述

在这里插入图片描述

二 . 调用服务

1 . 需要先通过wsdl说明文档生成发布方的代码 (wsdl地址)
在这里插入图片描述
2 . 生成的发布方代码

在这里插入图片描述
3 . 将 .java结尾的文件都复制到项目与文件目录一致的包下边

在这里插入图片描述
4 . 调用代码

main方法启动测试

package com.test.client;

import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import java.net.MalformedURLException;
import java.net.URL;

public class clientTest {
    public static void main(String[] args) throws MalformedURLException {
        //参数一 : wsdl文档中的 targetNamespace 地址     参数二: targetNamespace 地址后边的name (视图) 地址
        QName qName = new QName("http://service.test.com/", "WebServiceITestmplService");
        Service service = Service.create(new URL("http://localhost:8888/ws?wsdl"), qName);
        //参数为 : 实现类的对象
        WebServiceITestmpl portType = service.getPort(WebServiceITestmpl.class);
        //测试调用,传递测试参数数据
        String s = portType.acceptLogs("1101011001120", "123456789", "login", "推送日志");
        System.out.println(s);

    }
}

测试结果:

在这里插入图片描述


直接调用,不用生成服务端接口,new Service() 调用

两个方法相同,只是参数多少

//单个参数
public String findUserInfoByName(String name) {
        String result = null;
        try {
            String endpoint = "http://test.com/CrmInfo/CrmInfoPort?wsdl";
            //直接引用远程的wsdl文件
            //以下都是套路
            Service service = new Service();
            Call call = (Call) service.createCall();
            call.setTargetEndpointAddress(new java.net.URL(endpoint));
            /**
            *注意这里,要设置Namespace
            */
            call.setOperationName(new QName("http://server.com/","findUserInfoByName"));//WSDL里面描述的接口名称
            call.addParameter("arg0", XMLType.XSD_STRING,
                    ParameterMode.IN);//接口的参数
            call.setReturnType(org.apache.axis.encoding.XMLType.XSD_STRING);//设置返回类型
            result = (String)call.invoke(new Object[]{name});
            //给方法传递参数,并且调用方法
            System.out.println("result is :"+result);
        }
        catch (Exception e) {
            System.err.println(e.toString());
        }
        return result;
    }

//多个参数


 Call call = null;
        String returnstr = "";
        try {
            org.apache.axis.client.Service axiService = new org.apache.axis.client.Service();
            call = (Call) axiService.createCall();
            call.setTargetEndpointAddress(new java.net.URL(url));
            //参数一: targerNameSpace  参数二: 方法的名字
            call.setOperationName(new QName("http://service.test.com/", "AcceptLogs"));// 设置操作的名称。
            call.addParameter("arg0", XMLType.XSD_STRING, ParameterMode.IN);// 参数的类型,  注意如果写的是参数名的话可能服务端接收的数据为null,用arg0...可以!
            call.addParameter("arg1", XMLType.XSD_STRING, ParameterMode.IN);// 参数的类型
            call.addParameter("arg2", XMLType.XSD_STRING, ParameterMode.IN);// 参数的类型
            call.addParameter("arg3", XMLType.XSD_STRING, ParameterMode.IN);// 参数的类型
            call.setReturnType(XMLType.XSD_STRING);// 返回的数据类型
            String ret = (String) call.invoke(new Object[]{RegID, "123456", "login", loginListXml});// 执行调用
            returnstr = new String(ret.getBytes());
            logger.info(returnstr);

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


问题:
java 调用webservice 服务端收到参数为null

务端得不到参数,后来发现只改一个地方就可以了:

call.addParameter(“arg0”, XMLType.XSD_DATE,ParameterMode.IN); 这样是OK的

call.addParameter(“name”, XMLType.XSD_DATE,ParameterMode.IN); 这样服务端接收到的参数就是 null

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值