项目记录——Springboot + WebService

Webservice

  • 由于在项目中需要调用他人接口/编写自己的接口,进行了一点简单的了解。个人理解为它是部署在Web服务器上,向外暴露服务供外界调用的一个API,使用XML来封装数据,通过HTTP协议发送请求和接收结果,特定的HTTP消息头和XML内容格式通过SOAP协议规定。
  • WebService通过一个WSDL文件来说明自己有什么服务可以对外调用,用于描述WebService及其方法、参数和返回值。 WSDL文件保存在Web服务器上,通过一个url地址就可以访问到它,客户端要调用一个WebService服务之前,要知道该服务的WSDL文件的地址。WebService服务提供商可以通过两种方式来暴露它的WSDL文件地址:1.注册到UDDI服务器,他人查找;2.直接告知客户端调用者。

WebService调用(Springboot + CXF)

  • 依赖:
<dependency>
    <groupId>org.apache.cxf</groupId>
    <artifactId>cxf-spring-boot-starter-jaxws</artifactId>
    <version>3.1.12</version>
</dependency>
  1. 动态调用
		//JaxWsDynamicClientFactory 只要指定服务器端wsdl文件的位置,然后指定要调用的方法和方法的参数即可,不关心服务端的实现方式
        JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
        Client client = dcf.createClient("http://localhost:8888/student_webservice/student?wsdl");
        // 设置用户名密码
        client.getOutInterceptors().add(new ClientLoginInterceptor("admin", "admin"));
        Object[] objects = new Object[0];
        try {
            QName opName = new QName("http://service.testwebservice.demo.com", "getStudent");   //参数1 是targetNamespace的空间名,参数2 是方法名
            objects = client.invoke(opName,[需要传输的参数(字符串等)]);
            System.out.println("返回数据:" + objects[0]);
        } catch (java.lang.Exception e) {
            e.printStackTrace();
        }
  1. 静态调用(IDEA)
    (1)获取WSDL地址(以查询手机归属地的WebService为例),在IDEA项目中任意包名右键(会在此包生成Webservice的Java类),点击WebService,然后填入WSDL地址,点击OK即可生成静态文件(可手动删除class文件)
    在这里插入图片描述
    在这里插入图片描述
    (2)创建一个测试类,进行调用
	public static void main(String[] args) {
        //创建一个MobileCodeWS工厂
        MobileCodeWS factory = new MobileCodeWS();
        //根据工厂创建一个MobileCodeWSSoap对象
        MobileCodeWSSoap mobileCodeWSSoap = factory.getMobileCodeWSSoap();
        //调用WebService提供的getMobileCodeInfo方法查询手机号码的归属地
        String searchResult = mobileCodeWSSoap.getMobileCodeInfo("xxxxxxxxxxx", null);
        System.out.println(searchResult);
    }

WebService创建发布(Springboot + CXF)

  1. 声明接口
@WebService(name = "smart",  // 暴露服务名称
			targetNamespace="http://webservice.testinterface.com/") // 命名空间,一般是接口的包名倒序
public interface TestService {
	@WebMethod
	@WebResult(name = "String", targetNamespace = "http://webservice.testinterface.com/")
	public String save(@WebParam(name="arg0") String accessID,
                       @WebParam(name="arg1") String xml);
  1. 接口实现
    @Override
    public String save(@WebParam(name="arg0", targetNamespace = "http://webservice.testinterface.com/") String accessID,
                       @WebParam(name="arg1", targetNamespace = "http://webservice.testinterface.com/") String xml){
        //以接收参数为XML字符串为例
        //xml转对象操作
        XStream xs = new XStream();
        xs.setMode(XStream.NO_REFERENCES);
        xs.ignoreUnknownElements();
        xs.processAnnotations(PubModel.class);
        xs.setClassLoader(PubModel.class.getClassLoader());
        PubModel pubModel = (PubModel) xs.fromXML(xml);
        if(null==pubModel) {
        	//返回错误消息(以XML格式)
            ResponseModel responseModel = new ResponseModel();
            ResultModel res = new ResultModel("102", "无参数");
            responseModel.setResultModel(res);
            XStream xStream = new XStream(new XppDriver());
            xStream.alias("Response", ResponseModel.class);
            return xStream.toXML(responseModel);
        }
        ...
        /*
        * 接收、处理数据一系列操作
        */
        ...
        //返回成功消息(以XML格式)
        ResponseModel responseModel = new ResponseModel();
        ResultModel res = new ResultModel("200", "成功");
        XStream xStream = new XStream(new XppDriver());
        xStream.alias("Response", ResponseModel.class);
        return xStream.toXML(responseModel);
    }
  1. Webserivce配置
  • 在主包下再新建一个config包,并新建一个CxfConfig类
    在这里插入图片描述
@Configuration
public class CxfConfig {

    @Bean(name = "cxfServlet")
    public ServletRegistrationBean cxfServlet(){
        return new ServletRegistrationBean(new CXFServlet(),"/webservice/*");
    }
    
    @Bean
    public TestService testService(){
        return new TestServiceImpl();
    }

    @Bean(name = Bus.DEFAULT_BUS_ID)
    public SpringBus springBus(){
        return new SpringBus();
    }

    @Bean
    public Endpoint endpoint(){
        EndpointImpl endpoint = new EndpointImpl(this.springBus(), this.testService());
        //服务发布
        endpoint.publish("/smart");
        return endpoint;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值