基于CXF——rest的webService

在开发过程中,我们可能会需要天气,电话号码等信息,然而这些信息我们的数据库中没有,而且这也并不是我们项目所侧重的地方,天气信息自然气象局有,电话信息自然通信公司有,那么如何才能得到这些数据呢?WebService是一种很好的解决方案,它是通过将自己写好的接口外放而让别人来调用接口的方法,整体而言,类似于RMI,但它有一些约束和特点。

WebService是跨平台的,也就是不限制语言,所以这就决定了WebService需要一个相同的协议来确定发送和解读保持一致。

这就是SOAP,它是一个以HTTP为基准,以XML为内容的协议,保证了发送和接受的一致性。

大致流程如下,客户端发送信息给资源服务器,信息中包括服务端调用方法的参数,服务器调用方法,结果返回给客户端。这样我的项目数据库中没有天气信息,但是我通过WebService可以从气象局那里获取到,我也不用管理这方面数据,真的非常方便。

那我们写一个案例看一下吧,我们的服务器端就是一个简单的查询学生信息的功能。

1.导入jar包(jar包非常的多,这里不在列举,详情百度)http://cxf.apache.org/download.html

2.接口

package com.hzy.RsServer;

import javax.jws.WebService;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import java.util.List;

@WebService
@Path("student")
/**
 * JAX-WS:webservice,一般说的是soap
 * JAX-RS:Rest service
 */
public interface IStudentService {

    //根据id查找学生
    @GET //get请求
    @Path("/query/{id} {name}") //访问路径
    @Produces(MediaType.APPLICATION_XML)//返回给客户的数据格式
    public Student query(@PathParam("id") long id,@PathParam("name") String name);

    //根据名字查询所有学生(张)
    @GET
    @Path("/queryList/{name}") //访问路径
    //@Produces(MediaType.APPLICATION_XML)//返回给客户的数据格式
    public List<Student> queryList(@PathParam("name") String name);
}

这里说一下这些注解的意思@WebService用来标记接口,表示这是一个提供WebService的接口。

@path是路径因为http访问,那么我们如果访问这个接口下的方法的话,http://127.0.0.1:54199/user/student/query/1 2?wsdl

这样就很清楚了,user是我发布时写的,student是我这个服务类,query是方法,1 2是参数 ,wsdl只是看文本树。这样就可以精确的定位到一个方法了。传统模式下我们是获取到代理对象来调用方法的,而这里可以直接定位到方法,显得更加简便。

3.实现类

 
package com.hzy.RsServer;

import java.util.ArrayList;
import java.util.List;

public class StudentServiceImpl implements IStudentService {
    @Override
    public Student query(long id,String name) {
        Student student = new Student(id,name,"555");
        return student;
    }

    @Override
    public List<Student> queryList(String name) {
        List<Student> students = new ArrayList<Student>();

        for(long i=0;i<3;i++){
            Student student = new Student(i,name + i ,"555");
            students.add(student);
        }

        return students;
    }
}

常规操作,完成你的业务就好。

5.记得在你用过的pojo类上加上注解 

@XmlRootElement(name = "student") 这是用来告诉框架这个pojo需要转换成xml。

6.运行

import com.hzy.RsServer.StudentServiceImpl;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;

public class Main {
    public static void main(String[] args) {
        //框架内置Bean,放东西的,用就是了
        JAXRSServerFactoryBean jaxrsServerFactoryBean = new JAXRSServerFactoryBean();
        //设置我们的实现类class
        jaxrsServerFactoryBean.setResourceClasses(StudentServiceImpl.class);
        //设置我们的实现对象,内部会通过动态代理完成远程调用模块
        jaxrsServerFactoryBean.setServiceBean(new StudentServiceImpl());
        //写出我们的访问路径
        jaxrsServerFactoryBean.setAddress("http://127.0.0.1:54199/user");
        //发布
        jaxrsServerFactoryBean.create();
    }
}

我们发布了以后用浏览器发个http请求。http://127.0.0.1:54199/user/student/query/1 2?wsdl

没错浏览器上返回了该方法的返回值而且是一个对象。

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值