Jersey入门——对Json的支持

Jersey rest接口对POJO的支持如下: 

package com.coshaho.learn.jersey;

import java.net.URI;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;

import org.glassfish.grizzly.http.server.HttpServer;

import com.coshaho.learn.jersey.pojo.MyRequest;
import com.coshaho.learn.jersey.pojo.MyResponse;
import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
import com.sun.jersey.api.json.JSONConfiguration;

public class MyJsonServer 
{
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public MyResponse query(MyRequest req) 
    {
        System.out.println("Request parameter is " + req.getQuery() + " " + req.isFlag());
        MyResponse resp = new MyResponse();
        resp.setCode(0);
        resp.setDes(req.getQuery());
        return resp;
    }
    
    public static void main(String[] args) throws Exception
    {
        URI uri = UriBuilder.fromUri("http://127.0.0.1").port(10000).build();
        ResourceConfig rc = new PackagesResourceConfig("com.coshaho.learn.jersey.pojo");
        
        //参数支持json
        rc.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, true);
        HttpServer server = GrizzlyServerFactory.createHttpServer(uri, rc);
        server.start();
        
        Thread.sleep(1000*1000);
    }
}

package com.coshaho.learn.jersey;

import javax.ws.rs.core.MediaType;

import com.coshaho.learn.jersey.pojo.MyRequest;
import com.coshaho.learn.jersey.pojo.MyResponse;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;
import com.sun.jersey.api.json.JSONConfiguration;

public class MyJsonClient 
{
    public static void main(String[] args) 
    {
        ClientConfig cc = new DefaultClientConfig();
        
        //参数支持json
        cc.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);
        Client client = Client.create(cc);
        WebResource resource = client.resource("http://127.0.0.1:10000/query");
        
        MyRequest req = new MyRequest();
        req.setQuery("age");
        req.setFlag(false);
        
        ClientResponse response = resource
                .accept(MediaType.APPLICATION_JSON)
                .type(MediaType.APPLICATION_JSON)
                .post(ClientResponse.class, req);
        
        MyResponse resp = response.getEntity(MyResponse.class);
        System.out.println("Response is " + resp.getCode() + " " + resp.getDes());
    }
}

package com.coshaho.learn.jersey.pojo;

public class MyRequest 
{
    private String query;
    
    private boolean flag;

    public String getQuery() 
    {
        return query;
    }

    public void setQuery(String query) 
    {
        this.query = query;
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}

package com.coshaho.learn.jersey.pojo;

public class MyResponse 
{
    private int code;
    
    private String des;
    
    public int getCode() 
    {
        return code;
    }
    
    public void setCode(int code) 
    {
        this.code = code;
    }
    
    public String getDes() 
    {
        return des;
    }
    
    public void setDes(String des) 
    {
        this.des = des;
    }
}

 这种方式的缺点是进行如下设置,并且与业务代码耦合

cc.getFeatures().put(JSONConfiguration.FEATURE_POJO_MAPPING, Boolean.TRUE);

1、 对于POJO对象,我们使用@XmlRootElement把其定义为xml bean,可以省略上述代码

@XmlRootElement
public class MyRequest 

2、 使用JSONObject进行参数传递,可以省略上述代码

package com.coshaho.learn.jersey;

import java.net.URI;

import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriBuilder;

import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;
import org.glassfish.grizzly.http.server.HttpServer;

import com.sun.jersey.api.container.grizzly2.GrizzlyServerFactory;
import com.sun.jersey.api.core.PackagesResourceConfig;
import com.sun.jersey.api.core.ResourceConfig;
 
@Path("query") 
public class MyJsonServer 
{
    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public JSONObject query(JSONObject query) throws JSONException 
    {
        System.out.println(query.toString());
        
        JSONObject resp = new JSONObject();
        resp.put("code", 0);
        resp.put("des", query.get("query"));
        return resp;
    }
    
    public static void main(String[] args) throws Exception
    {
        URI uri = UriBuilder.fromUri("http://127.0.0.1").port(10000).build();
        ResourceConfig rc = new PackagesResourceConfig("com");
        HttpServer server = GrizzlyServerFactory.createHttpServer(uri, rc);
        server.start();
        Thread.sleep(1000*1000);
    }
}

package com.coshaho.learn.jersey;

import javax.ws.rs.core.MediaType;

import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;

public class MyJsonClient {

    public static void main(String[] args) throws JSONException 
    {
        ClientConfig cc = new DefaultClientConfig();
        Client client = Client.create(cc);
        WebResource resource = client.resource("http://127.0.0.1:10000/query");
        
        JSONObject req = new JSONObject();
        req.put("query", "name");
        
        ClientResponse response = resource
                .accept(MediaType.APPLICATION_JSON)
                .type(MediaType.APPLICATION_JSON)
                .post(ClientResponse.class, req);
        
        JSONObject resp = response.getEntity(JSONObject.class);
        System.out.println(resp.toString());
    }
}

 3、客户端使用String方式传递参数,服务端可以把String自动转换为JSONObject,客户端也可以把JSONObject自动转换为String

package com.coshaho.learn.jersey;

import javax.ws.rs.core.MediaType;

import org.codehaus.jettison.json.JSONException;
import org.codehaus.jettison.json.JSONObject;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;

public class MyJsonClient {

    public static void main(String[] args) throws JSONException 
    {
        ClientConfig cc = new DefaultClientConfig();
        Client client = Client.create(cc);
        WebResource resource = client.resource("http://127.0.0.1:10000/query");
        
        JSONObject req = new JSONObject();
        req.put("query", "name");
        
        String response = resource
                .accept(MediaType.APPLICATION_JSON)
                .type(MediaType.APPLICATION_JSON)
                .post(String.class, req.toString());
        
        System.out.println(response);
    }
}

 

posted @ 2017-11-03 16:51  coshaho  阅读(2734)  评论(0编辑  收藏  举报