一、HTTP数据的压缩

  在http协议中当content-encoding对应的值为gzip,deflate,x-gzip,x-deflate时,数据是经过了压缩之后再进行传输的。有些时候我们当我们传输的数据比较大的时候,可以采取这种方式,从而提高数据的传输速度。在web service中,当某个接口返回的数据比较大的时候,也可以进行压缩处理。

二、示例

  1、使用soap协议的web service

  实体类:

package com.cxf.compress.ws;

public class Person {
private String name; private String homeAddress; private String companyAddress; public Person() {
StringBuilder sb = new StringBuilder(); for (int i = 1; i < 10; ++i) {
sb.append("X");
} this.name = sb.toString();
this.homeAddress = sb.toString();
this.companyAddress = sb.toString();
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getHomeAddress() {
return homeAddress;
} public void setHomeAddress(String homeAddress) {
this.homeAddress = homeAddress;
} public String getCompanyAddress() {
return companyAddress;
} public void setCompanyAddress(String companyAddress) {
this.companyAddress = companyAddress;
}
}

  接口MyService:

package com.cxf.compress.ws;
import java.util.List; import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.jws.WebService; @WebService
public interface MyService{
@WebMethod
@WebResult(name = "personResult")
public List<Person> getPerson();
}

  实现类MyServiceImpl:

package com.cxf.compress.ws;
import java.util.ArrayList;
import java.util.List; public class MyServiceImpl implements MyService {
@Override
public List<Person> getPerson() {
List<Person> list = new ArrayList<Person>(); list.add(new Person());
list.add(new Person());
list.add(new Person());
list.add(new Person()); return list;
}
}

  服务端启动类:

package com.cxf.compress.ws;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.transport.common.gzip.GZIPInInterceptor;
import org.apache.cxf.transport.common.gzip.GZIPOutInterceptor;
/**
* 使用数据压缩
*
*/
public class MyServer {
public static void main(String[] args) {
JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean(); factoryBean.getInInterceptors().add(new GZIPInInterceptor());//解压使用 gzip的请求
factoryBean.getInInterceptors().add(new LoggingInInterceptor()); GZIPOutInterceptor out = new GZIPOutInterceptor();
out.setThreshold(0);//压缩数据的阀值设置为0, 默认超过1k的数据才使用gzip压缩,设置为0,表示响应的数据只要大于0就进行压缩处理 factoryBean.getOutInterceptors().add(out);//返回的数据使用gizp压缩
factoryBean.getOutInterceptors().add(new LoggingOutInterceptor()); String address = "http://localhost:8080/cxf/myservice";
factoryBean.setAddress(address);
factoryBean.setServiceClass(MyServiceImpl.class); factoryBean.create();
}
}

  客户端请求类:

package com.cxf.compress.ws;

import java.util.List;

import org.apache.cxf.endpoint.Client;
import org.apache.cxf.endpoint.Endpoint;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.transport.common.gzip.GZIPInInterceptor;
import org.apache.cxf.transport.common.gzip.GZIPOutInterceptor; public class MyClient {
public static void main(String[] args) {
JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean(); factoryBean.setAddress("http://localhost:8080/cxf/myservice");
factoryBean.setServiceClass(MyService.class); Object object = factoryBean.create(); Client client = ClientProxy.getClient(object); Endpoint endpoint = client.getEndpoint(); endpoint.getInInterceptors().add(new GZIPInInterceptor());//解压使用 gzip的请求 GZIPOutInterceptor out = new GZIPOutInterceptor();
out.setThreshold(0);//压缩数据的阀值设置为0, 默认超过1k的数据才使用gzip压缩,设置为0,表示响应的数据只要大于0就进行压缩处理 endpoint.getOutInterceptors().add(out);//返回的数据使用gizp压缩 MyService service = (MyService) object; List<Person> list = service.getPerson(); System.out.println("name: " + list.get(0).getName());
}
}

  2、restful web service

  实体类Person:

package com.cxf.compress.rs;

import java.util.Date;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "person")
public class Person { private int id;
private String name;
private Date date; public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Date getDate() {
return date;
} public void setDate(Date date) {
this.date = date;
} }

  服务接口MyService:

package com.cxf.compress.rs;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces; @Path("person")
@Produces("*/*")
public interface MyService { @GET
@Path("/")
public java.util.List<Person> getAll(); }

  服务接口实现类MyServiceImpl:

package com.cxf.compress.rs;
import java.util.Date;
import java.util.List; import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces; public class MyServiceImpl implements MyService { @Override
public List<Person> getAll() {
List<Person> persons = new java.util.ArrayList<Person>();
Person person = new Person();
person.setId(111);
person.setName("zhangsan");
person.setDate(new Date()); Person person2 = new Person();
person2.setId(222);
person2.setName("lisi");
person2.setDate(new Date());
persons.add(person);
persons.add(person2);
return persons;
} }

  服务类Server:

package com.cxf.compress.rs;

import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;
import org.apache.cxf.transport.common.gzip.GZIPInInterceptor;
import org.apache.cxf.transport.common.gzip.GZIPOutInterceptor; public class Server {
public static void main(String[] args) { JAXRSServerFactoryBean factoryBean = new JAXRSServerFactoryBean();
factoryBean.setAddress("http://localhost:8080/myservice");
factoryBean.setResourceClasses(MyServiceImpl.class); factoryBean.getInInterceptors().add(new GZIPInInterceptor());//解压使用 gzip的请求
factoryBean.getInInterceptors().add(new LoggingInInterceptor()); GZIPOutInterceptor out = new GZIPOutInterceptor();
out.setThreshold(0);//压缩数据的阀值设置为0, 默认超过1k的数据才使用gzip压缩,设置为0,表示响应的数据只要大于0就进行压缩处理 factoryBean.getOutInterceptors().add(out);//返回的数据使用gizp压缩
factoryBean.getOutInterceptors().add(new LoggingOutInterceptor()); factoryBean.create();
}
}

  客户端访问类Client:

package com.cxf.compress.rs;

import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult; import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.io.CachedOutputStream;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element; public class Client {
public static void main(String[] args) throws Exception {
String getResult = get("http://localhost:8080/myservice/person");
System.out.println(getResult); } private static String get(String url) throws IOException,
ParserConfigurationException {
HttpGet get = new HttpGet(url);
get.setHeader("Accept", "application/json");
get.addHeader("Accept-Encoding" ,"gzip"); //请求使用数据压缩
CloseableHttpClient client = HttpClients.createDefault();
String responseContent = null;
CloseableHttpResponse response = null;
try {
response = client.execute(get);
HttpEntity entity = response.getEntity();// 响应体
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 响应码
responseContent = EntityUtils.toString(entity, "UTF-8");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} return responseContent;
} }

  对于使用了gzip进行压缩之后的响应,通过topMon进行监听后,传输的数据大小会小很多。  

cxf数据压缩的更多相关文章

  1. 【探索】利用 canvas 实现数据压缩

    前言 HTTP 支持 GZip 压缩,可节省不少传输资源.但遗憾的是,只有下载才有,上传并不支持.如果上传也能压缩,那就完美了.特别适合大量文本提交的场合,比如博客园,就是很好的例子. 虽然标准不支持 ...

  2. java调用CXF WebService接口的两种方式

    通过http://localhost:7002/card/services/HelloWorld?wsdl访问到xml如下,说明接口写对了. 2.静态调用 // 创建WebService客户端代理工厂 ...

  3. webService学习之路(三):springMVC集成CXF后调用已知的wsdl接口

    webService学习之路一:讲解了通过传统方式怎么发布及调用webservice webService学习之路二:讲解了SpringMVC和CXF的集成及快速发布webservice 本篇文章将讲 ...

  4. webService学习之路(二):springMVC集成CXF快速发布webService

    继上一篇webService入门之后,http://www.cnblogs.com/xiaochangwei/p/4969448.html ,现在我将我周六在家研究的结果公布出来 本次集成是基于之前已 ...

  5. CXF:根据werservice代码生成WSDL(转)

    原文:http://hongyegu.iteye.com/blog/619147,谢谢! import org.apache.cxf.tools.java2ws.JavaToWS; import ne ...

  6. webservice入门实例,CXF方式

    1.下载CXF,及先关jar包. CXF 下载地址:http://cxf.apache.org/download.html,选择"File"列中的zip格式下载.解压后可以看到一些 ...

  7. 脱离spring集成cxf(基于nutz框架)

    什么是webService WebService是一种跨编程语言和跨操作系统平台的远程调用技术. 理论资料: http://blog.csdn.net/wooshn/article/details/8 ...

  8. WebService -- Java 实现之 CXF ( 使用Spring添加拦截器)

    最重要的就是在ApplicationContext.xml下面添加配置 <!-- service provider --> <jaxws:endpoint implementor=& ...

  9. WebService -- Java 实现之 CXF ( 使用:Spring+CXF+Tomcat发布webService)

    1. 新建一个Maven项目,选择webapp模板,命名为WS_Spring_CXF_Tomcat 2. 在POM.xml中添加Spring和CXF的依赖 <!-- 添加 Spring depe ...

随机推荐

  1. jQuery源码分析之=>jQuery的定义

    最近写前段的代码比较多,jQuery是用的最多的一个对象,但是之前几次看了源码,都没搞清楚jQuery是怎么定义的,今天终于看明白怎么回事了.记录下来,算是一个新的开始吧. (文中源码都是jQuery ...

  2. [ORM] Entity Framework(2) CodeFirst进阶

    在上一节中,实现了CodeFirst快速入门.但是很多与数据库的细节还无法自定义.以及使用EF过程中,需要注意的事项. 在本节中,会涉及到以下 EF中的连接字符串 EF的对象状态 延迟加载,为什么需要 ...

  3. dos系统

    实验一  命令解释程序的编写 一.目的和要求 1. 实验目的 (1)掌握命令解释程序的原理: (2)掌握简单的DOS调用方法: (3)掌握C语言编程初步. 2.实验要求 编写类似于DOS,UNIX的命 ...

  4. Sprint 3计划

    一.计划目标: 1.完成基本的首页面的信息查询功能 2.学生家教用户注册和登录,将信息存储到数据库 3.完成家教的资格评定设定和个人教学内容备份信息 二.燃尽图 三.项目具体工作细则 待明天工作会议分 ...

  5. Orleans之Hello World

    接触Orleans 有一段时间了,之前也翻译了一系列官网文档,今天我们就来一个实际的例子,来看看到底如何用这个东西来开发项目,当然经典的也是醉人的,我们就从HelloWorld开始吧. 通过前面的知识 ...

  6. Linq之select子句

    在Linq中select子句用来指定查询结果的类型和表现形式.Linq查询要么以select子句结尾,要么以group子句结尾. List<UserBaseInfo> users = ne ...

  7. macbook装双系统多分区其实很简单,你只要把macbook当作一台普通pc就可以了!

    macbook装双系统多分区其实很简单,你只要把macbook当作一台普通pc就可以了! 不用理会苹果官网的警告,苹果官网警告你只能用bootcamp安装且不能多分区,把人吓得不轻.其实不用过多担心, ...

  8. 簡單SQL存儲過程實例

    簡單SQL存儲過程實例 摘自:http://blog.csdn.net/libra6956/article/details/5589173 实例1:只返回单一记录集的存储过程. 银行存款表(bankM ...

  9. spring jdbcTemplate query

    1. spring jdbcTemplate query需要实现mapRow方法 package com.cdv.apolloagent.jdbc.dao.impl; import java.sql. ...

  10. http服务&ajax编程

    http服务&ajax编程 1.服务器 前言:通俗的讲,能够提供某种服务的机器(计算机)称为服务器 1.1.服务器类型 按照不同的划分标准,服务可划分为以下类型: 按服务类型可分为:文件服务器 ...