WebService的重头戏---restful

现如今,抬头看,restful的阵营小伙伴越来越多,面向资源的调用方式正被广大开发者逐渐接受,尽管在实际项目中很难严格按照restful来设计接口(因为有些业务场景的确无法用现有的表述方式表达出来),但是我相信它会越来越完善,让我们在期待中一起学习吧。

REST(表述性状态转移)是继 SOAP 以后,另一种广泛使用的 Web 服务。与 SOAP 不同,REST 并没有 WSDL 的概念,也没有叫做“信封”的东西,因为 REST 主张用一种简单粗暴的方式来表达数据,传递的数据格式可以是 JSON 格式,也可以是 XML 格式(统一资源,多种表述)

CXF 关于 REST 的依赖包,并使用了 Jackson 来实现 JSON 数据的转换

@POST
@Path("/products")
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
List<Product> retrieveProductsByName(@FormParam("name") String name);

如上代码使用了 JAX-RS 提供的注解:
1. 请求方式注解,包括:@GET、@POST、@PUT、@DELETE
2. 请求路径注解,包括:@Path,其中包括一个路径参数
3. 数据格式注解,包括:@Consumes(输入)、@Produces(输出),可使用 MediaType 常量
4. 相关参数注解,包括:@PathParam(路径参数)、@FormParam(表单参数),此外还有 @QueryParam(请求参数)

@PUT
@Path("/product/{id}")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
Product updateProductById(@PathParam("id") long id, Map<String, Object> fieldMap);

该方法将被 PUT:/product/{id} 请求来调用,请求路径中的 id 参数将映射到 long id 参数上,请求体中的数据将自动转换为 JSON 格式并映射到 Map< String, Object> fieldMap 参数上,返回的 Product 类型的数据将自动转换为 JSON 格式并返回到客户端。

使用 CXF 发布 REST 服务

import java.util.ArrayList;
import java.util.List;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;
import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;
import org.codehaus.jackson.jaxrs.JacksonJsonProvider;

public class Server {

    public static void main(String[] args) {
        // 添加 ResourceClass
        List<Class<?>> resourceClassList = new ArrayList<Class<?>>();
        resourceClassList.add(ProductServiceImpl.class);

        // 添加 ResourceProvider
        List<ResourceProvider> resourceProviderList = new ArrayList<ResourceProvider>();
        resourceProviderList.add(new SingletonResourceProvider(new ProductServiceImpl()));

        // 添加 Provider
        List<Object> providerList = new ArrayList<Object>();
        providerList.add(new JacksonJsonProvider());

        // 发布 REST 服务
        JAXRSServerFactoryBean factory = new JAXRSServerFactoryBean();
        factory.setAddress("http://localhost:8080/ws/rest");
        factory.setResourceClasses(resourceClassList);
        factory.setResourceProviders(resourceProviderList);
        factory.setProviders(providerList);
        factory.create();
        System.out.println("rest ws is published");
    }
}

CXF 提供了一个名为 org.apache.cxf.jaxrs.JAXRSServerFactoryBean 的类,专用于发布 REST 服务,只需为该类的实例对象指定四个属性即可:
Address:REST 基础地址
ResourceClasses:一个或一组相关的资源类,即接口对应的实现类(注意:REST 规范允许资源类没有接口)
ResourceProviders:资源类对应的 Provider,此时使用 CXF 提供的 org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider 进行装饰
Providers:REST 服务所需的 Provider,此时使用了 Jackson 提供的 org.codehaus.jackson.jaxrs.JacksonJsonProvider,用于实现 JSON 数据的序列化与反序列化

CXF 有一种更为简洁的方式,使用 org.apache.cxf.jaxrs.client.WebClient 来调用 REST 服务,如下:

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

import javax.ws.rs.core.MediaType;

import org.apache.cxf.jaxrs.client.WebClient;
import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider;
import org.codehaus.jackson.jaxrs.JacksonJsonProvider;
import org.junit.Test;

public class WebClientTest {

    private static final String baseAddress = "http://localhost:8080/ws/rest";

    private static final List<Object> providerList = new ArrayList<Object>();

    static {
        providerList.add(new JacksonJsonProvider());
    }

    @Test
    public void helloServiceSayTest() {
        String result = WebClient.create(baseAddress)
            .path("/hello/say")
            .query("name", "world")
            .get(String.class);
        System.out.println(result);
    }

    @Test
    public void test1() {
        String productList = WebClient.create("http://localhost:8080/yanglao/ws/rest/mobileSysUser", providerList)
                .path("/users")
                .accept(MediaType.APPLICATION_JSON)
                .get(String.class);
        System.out.println(productList);
    }

    @Test
    public void test2() {
        List<Object> providers = new ArrayList<Object>();
        providers.add(new JacksonJaxbJsonProvider());
        WebClient client = WebClient.create("http://localhost:8080/yanglao/ws/rest/mobileSysUser", providers);
        String object = (String) client.accept("application/json").type("application/json").path("/loginWithdevicetoken").post(
                "{\"nickname\":\"one\",\"password\":\"12\",\"devicetoken\":\"fdasdfasdfaefrwqerfqweftgwg0\"}").readEntity(String.class);

        System.out.println("Order:" + object);
    }
}

整个系列博客的源代码(源码由学习资源的博主黄勇提供):http://git.oschina.net/huangyong/cxf_demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值