RestEasy开发WebService一

来源:互联网 发布:qq头像源码大全 编辑:程序博客网 时间:2024/05/21 12:46

1.搭建RestEasy项目

基于resteasy版本:2.2.1.GA

使用maven2.2.1作为构建和依赖管理工具

1.创建工程,配置pom.xml

mvn archetype:create -DgroupId=com.longtask.rest.easyrest -DartifactId=easyrest -DarchetypeArtifactId=maven-archetype-webapp

mvn eclipse:eclipse

注:使用m2eclipse插件可直接import
[html] view plaincopy
  1. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  2.   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
  3.   <modelVersion>4.0.0</modelVersion>  
  4.   <groupId>rest.resteasy</groupId>  
  5.   <artifactId>rest-resteay-demo</artifactId>  
  6.   <packaging>war</packaging>  
  7.   <version>1.0</version>  
  8.   <name>rest-resteay-demo Maven Webapp</name>  
  9.   <url>http://maven.apache.org</url>  
  10.   <repositories>  
  11.         <repository>  
  12.             <id>java.net</id>  
  13.             <url>http://download.java.net/maven/1</url>  
  14.             <layout>legacy</layout>  
  15.         </repository>  
  16.         <repository>  
  17.             <id>maven repo</id>  
  18.             <name>maven repo</name>  
  19.             <url>http://repo1.maven.org/maven2/</url>  
  20.         </repository>  
  21.         <!-- For resteasy -->  
  22.         <repository>  
  23.             <id>jboss</id>  
  24.             <name>jboss repo</name>  
  25.             <url>http://repository.jboss.org/nexus/content/groups/public/</url>  
  26.         </repository>  
  27.     </repositories>  
  28.   <dependencies>  
  29.     <dependency>  
  30.             <groupId>org.jboss.resteasy</groupId>  
  31.             <artifactId>resteasy-jaxrs</artifactId>  
  32.             <version>2.2.1.GA</version>  
  33.             <!-- filter out unwanted jars -->  
  34.             <exclusions>  
  35.                 <exclusion>  
  36.                     <groupId>commons-httpclient</groupId>  
  37.                     <artifactId>commons-httpclient</artifactId>  
  38.                 </exclusion>  
  39.                 <exclusion>  
  40.                     <groupId>javax.servlet</groupId>  
  41.                     <artifactId>servlet-api</artifactId>  
  42.                 </exclusion>  
  43.                 <exclusion>  
  44.                     <groupId>javax.xml.bind</groupId>  
  45.                     <artifactId>jaxb-api</artifactId>  
  46.                 </exclusion>  
  47.                 <exclusion>  
  48.                     <groupId>com.sun.xml.bind</groupId>  
  49.                     <artifactId>jaxb-impl</artifactId>  
  50.                 </exclusion>  
  51.             </exclusions>  
  52.         </dependency>  
  53.   
  54.         <dependency>  
  55.             <groupId>org.jboss.resteasy</groupId>  
  56.             <artifactId>resteasy-jettison-provider</artifactId>  
  57.             <version>2.2.1.GA</version>  
  58.             <exclusions>  
  59.                 <exclusion>  
  60.                     <groupId>javax.xml.bind</groupId>  
  61.                     <artifactId>jaxb-api</artifactId>  
  62.                 </exclusion>  
  63.                 <exclusion>  
  64.                     <groupId>com.sun.xml.bind</groupId>  
  65.                     <artifactId>jaxb-impl</artifactId>  
  66.                 </exclusion>  
  67.                 <exclusion>  
  68.                     <groupId>javax.xml.stream</groupId>  
  69.                     <artifactId>stax-api</artifactId>  
  70.                 </exclusion>  
  71.             </exclusions>  
  72.         </dependency>  
  73.     <dependency>  
  74.       <groupId>junit</groupId>  
  75.       <artifactId>junit</artifactId>  
  76.       <version>3.8.1</version>  
  77.       <scope>test</scope>  
  78.     </dependency>  
  79.   </dependencies>  
  80.  <build>  
  81.         <finalName>rest-resteay-demo</finalName>  
  82.         <plugins>  
  83.             <plugin>  
  84.                 <groupId>org.apache.maven.plugins</groupId>  
  85.                 <artifactId>maven-compiler-plugin</artifactId>  
  86.                 <configuration>  
  87.                     <source>1.6</source>  
  88.                     <target>1.6</target>  
  89.                 </configuration>  
  90.             </plugin>  
  91.         </plugins>  
  92.     </build>  
  93. </project>  
这个不是重点:看不懂这个pom.xml没关系,也就是下载依赖包,打包,先继续往下看

2.编写jax-rs的服务类

[java] view plaincopy
  1. package resteasy.server;  
  2.   
  3. import javax.ws.rs.GET;  
  4. import javax.ws.rs.Path;  
  5. import javax.ws.rs.PathParam;  
  6.   
  7. @Path(value = "echo")  
  8. public class Echo {  
  9.     @GET  
  10.     @Path(value = "/{message}")  
  11.     public String echoService(@PathParam("message") String message)  
  12.     {  
  13.         return message;  
  14.     }  
  15. }  

@Path表示开启访问这个资源的路径

@GET表示响应HTTP 的get方法

@PathParam表示引用URI中得参数

3.web.xml的配置

[html] view plaincopy
  1. <!DOCTYPE web-app PUBLIC  
  2.  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
  3.  "http://java.sun.com/dtd/web-app_2_3.dtd" >  
  4.   
  5. <web-app>  
  6.     <context-param>  
  7.         <param-name>resteasy.resources</param-name>  
  8.         <param-value>resteasy.server.Echo</param-value>  
  9.     </context-param>  
  10.    <listener>  
  11.       <listener-class>  
  12.          org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap  
  13.       </listener-class>  
  14.    </listener>  
  15.   
  16.    <servlet>  
  17.       <servlet-name>Resteasy</servlet-name>  
  18.       <servlet-class>  
  19.          org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher  
  20.       </servlet-class>  
  21.    </servlet>  
  22.   
  23.    <servlet-mapping>  
  24.       <servlet-name>Resteasy</servlet-name>  
  25.       <url-pattern>/*</url-pattern>  
  26.    </servlet-mapping>  
  27. </web-app>  
配置响应的listener和servlet无非就是初始resteasy的服务(先简单理解)

3.打包部署到响应的servlet容器即可(如tomcat),然后访问http://localhost:8080/rest-resteay-demo/echo/hello,world,网页上出现hello,world则成功
hello,world可换成任意字符,同样也将返回响应的字符

注:如果不使用maven,则可以到resteasy官网下载响应jar包即可


1.使用的 ServletContextListener 来初始化并发布我们的服务类

[html] view plaincopy
  1. <span style="color:#000000;"> <!DOCTYPE web-app PUBLIC    
  2.      "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"    
  3.      "http://java.sun.com/dtd/web-app_2_3.dtd" >      
  4.     <web-app>    
  5.  <context-param>    
  6.             <param-name>resteasy.resources</param-name>    
  7.             <param-value>resteasy.server.Echo</param-value>    
  8.         </context-param>    
  9. <listener>   
  10. <listener-class> org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap </listener-class>   
  11. </listener>   
  12. <servlet> <servlet-name>Resteasy</servlet-name>   
  13. <servlet-class> org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher </servlet-class>  
  14.  </servlet>   
  15.   
  16. <servlet-mapping>   
  17. <servlet-name>Resteasy</servlet-name> <url-pattern>/*</url-pattern>   
  18. </servlet-mapping>   
  19. </web-app></span>  


这是第一波中得web.xml,也就是用的listener来进行的服务发布:

查看源代码可以发现public class ResteasyBootstrap implements ServletContextListener,其实现了ServletContextListener 接口,通过获取

[html] view plaincopy
  1. <context-param>    
  2.            <param-name>resteasy.resources</param-name>    
  3.            <param-value>resteasy.server.Echo</param-value>    
  4.        </context-param>    
如上参数进行了服务类的加载.

[html] view plaincopy
  1. resteasy.resources  
代表通过指定资源类的全路径名进行加载,有多个资源类可通过逗号分开

查看官方文档可以发现其他用于加载资源类的参数

resteasy.scan.resources   默认值:false   用途:设置为ture时,将自动搜索 WEB-INF/lib下面的 jars 和 WEB-INF/classes目录中有(@GET @POST ...)注解的class并注册为服务
可用上一波的例子替换相应参数进行测试(亲测木有问题)
2.使用 servlet Filter 注册服务类web.xml如下
[html] view plaincopy
  1. <!DOCTYPE web-app PUBLIC  
  2.  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
  3.  "http://java.sun.com/dtd/web-app_2_3.dtd" >  
  4.   
  5. <web-app>  
  6.    <servlet>  
  7.       <servlet-name>Resteasy</servlet-name>  
  8.       <servlet-class>  
  9.          org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher  
  10.       </servlet-class>  
  11.        <init-param>  
  12.             <param-name>javax.ws.rs.Application</param-name>  
  13.             <param-value>resteasy.server.MyApplication</param-value>  
  14.         </init-param>  
  15.    </servlet>  
  16.   
  17.    <servlet-mapping>  
  18.       <servlet-name>Resteasy</servlet-name>  
  19.       <url-pattern>/*</url-pattern>  
  20.    </servlet-mapping>  
  21. </web-app>  
如上代码,我们发现相比前面例子去掉了listener,在servlet中多添加了一个
[html] view plaincopy
  1. javax.ws.rs.Application  
这是一个抽象类,是一个jax rs的标准规范,允许通过其子类注册你得资源类请看MyApplication代码
[java] view plaincopy
  1. package resteasy.server;  
  2.   
  3. import java.util.HashSet;  
  4. import java.util.Set;  
  5.   
  6. import javax.ws.rs.core.Application;  
  7.   
  8. public class MyApplication extends Application{  
  9.   
  10.     Set<Object> objectSet = new HashSet<Object>();  
  11.     Set<Class<?>> classSet = new HashSet<Class<?>>();  
  12.       
  13.     public MyApplication()  
  14.     {  
  15.         objectSet.add(new Echo());  
  16. //      classSet.add(Echo.class);  
  17.     }  
  18.     @Override  
  19.     public Set<Class<?>> getClasses() {  
  20.         // TODO Auto-generated method stub  
  21.         return classSet;  
  22.     }  
  23.   
  24.     @Override  
  25.     public Set<Object> getSingletons() {  
  26.         // TODO Auto-generated method stub  
  27.         return objectSet;  
  28.     }  
  29.       
  30.       
  31.   
  32. }  
通过构造函数添加了一个Echo的资源类实例,当然也可通过添加一个class来实现,二者选其一即可
3.使用 filter 注册服务类(也就是资源类)

作为servlet进行资源的注册,你会发现不能将静态文件(html,images)注册为资源,所以resteasy还提供了filter进行资源的注册,不妨碍其获取静态文件

继续引用上一个例子,只用修改其web.xml如下

[html] view plaincopy
  1. <!DOCTYPE web-app PUBLIC  
  2.  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
  3.  "http://java.sun.com/dtd/web-app_2_3.dtd" >  
  4.   
  5. <web-app>  
  6.     <filter>  
  7.         <filter-name>Resteasy</filter-name>  
  8.         <filter-class>  
  9.                 org.jboss.resteasy.plugins.server.servlet.FilterDispatcher  
  10.         </filter-class>  
  11.         <init-param>  
  12.             <param-name>javax.ws.rs.Application</param-name>  
  13.             <param-value>resteasy.server.MyApplication</param-value>  
  14.         </init-param>  
  15.     </filter>  
  16.     <filter-mapping>  
  17.         <filter-name>Resteasy</filter-name>  
  18.         <url-pattern>/*</url-pattern>  
  19.     </filter-mapping>  
  20. </web-app>  

实现文件上传---非form提交方式(实例、教程)

这里指的上传是指利用resteasy来获取:客户端HTTP开发包发送的body请求-----刚开始也没撒头绪,第一时间去google,发现有哥们问同样的问题,但是却没有解决方法,于是乎就只有硬着头皮看英文文档,发现如下文档:

The @Context annotation allows you to inject instances of javax.ws.rs.core.HttpHeaders, javax.ws.rs.core.UriInfo, javax.ws.rs.core.Request, javax.servlet.HttpServletRequest, javax.servlet.HttpServletResponse, javax.servlet.ServletConfig, javax.servlet.ServletContext, and javax.ws.rs.core.SecurityContext objects.

翻译下呢就是说使用@Context 注解就可以将 javax.ws.rs.core.HttpHeaders, javax.ws.rs.core.UriInfo, javax.ws.rs.core.Request, javax.servlet.HttpServletRequest, javax.servlet.HttpServletResponse, javax.servlet.ServletConfig, javax.servlet.ServletContext, and javax.ws.rs.core.SecurityContext等等实例注入到变量中

server端resource类代码如下:

[html] view plaincopy
  1. @PUT  
  2. @Path(value = "/{folder}/{fileName}")  
  3. public Response uploadFile(@PathParam("folder") String folder,@PathParam("fileName") String fileName,     @Context HttpServletRequest request)  
  4. {  
  5.     File f = new File("x:\\"+fileName);  
  6.     InputStream is = null;  
  7.     try {  
  8.         is = request.getInputStream();  
  9.         FileUtils.copyInputStreamToFile(is, f);  
  10.     } catch (IOException e) {  
  11.         // TODO Auto-generated catch block  
  12.         e.printStackTrace();  
  13.     }  
  14.     return Response.ok().build();  
  15. }  


请主要看下以上代码红色部分,就相当于把HttpServletRequest请求注入到了request变量中,那么通过request对象获取获取输入流,则得到了body主体部分的数据。

客户端的代码如下

[html] view plaincopy
  1. String urlResouce = "http://localhost:8080/cloud-storeage-boss/muluSDF/xyz.png"; // create URL  
  2.         File localFile = new File("C:\\Users\\maomao\\Pictures\\2.png");  
  3.         try{  
  4.               
  5.         HttpURLConnection urlConnection =  
  6.         (HttpURLConnection) (new URL(urlResouce)).openConnection();  
  7.         urlConnection.setDoInput(true);  
  8.         urlConnection.setDoOutput(true);  
  9.         urlConnection.setRequestMethod("PUT");  
  10.         OutputStream urlOutputStream = urlConnection.getOutputStream();  
  11.         FileInputStream fileInputStream = new FileInputStream(localFile);  
  12.         IOUtils.copy(fileInputStream, urlOutputStream);  
  13.         fileInputStream.close();  
  14.         urlOutputStream.close();  
  15.         System.out.println(urlConnection.getResponseCode());  
  16.         }  
  17.         catch(Exception e)  
  18.         {  
  19.             e.printStackTrace();  
  20.         }  
通过此客户端的调用,就可以将本地的2.png文件上传到服务器,并被保存为xyz.png.

resteasy与spring真正集成发布我们的restful webservice 服务(实例、教程)

原本以为根据文档集成resteasy与spring很简单,但是却还是花费的一定时间,避免大家走弯路----现在网上有的相关的集成都只是,spring加入进项目,木有与resteasy真正集成

老规矩,先上MAVEN的配置文件中依赖包:

[html] view plaincopy
  1.  <dependencies>  
  2.    <!-- core library -->  
  3.    <dependency>  
  4.       <groupId>org.jboss.resteasy</groupId>  
  5.       <artifactId>resteasy-jaxrs</artifactId>  
  6.       <version>2.2.1.GA</version>  
  7.    </dependency>  
  8.   
  9.    <!-- optional modules -->  
  10.      <!-- Spring integration -->  
  11.    <dependency>  
  12.       <groupId>org.jboss.resteasy</groupId>  
  13.       <artifactId>resteasy-spring</artifactId>  
  14.       <version>2.2.1.GA</version>  
  15.    </dependency>  
  16.       
  17.    <!-- JAXB support -->  
  18.    <dependency>  
  19.       <groupId>org.jboss.resteasy</groupId>  
  20.       <artifactId>resteasy-jaxb-provider</artifactId>  
  21.       <version>2.2.1.GA</version>  
  22.    </dependency>  
  23.       
  24.    <!-- spring -->  
  25.             <dependency>  
  26.                 <groupId>org.springframework</groupId>  
  27.                 <artifactId>spring</artifactId>  
  28.                                 <version>2.5.6.SEC03</version>  
  29.                        </dependency>  
  30. </dependencies>  

注意上图中得resteasy-spring模块依赖,和spring依赖

resteasy-spring直接配置似乎不能自动下载,如果不行可以自己去官网下载然后安装到私服仓库

还有spring的依赖必须是要有的,resteasy-spring只是提供集成代码

2.关键的web.xml中得配置

[html] view plaincopy
  1. <!DOCTYPE web-app PUBLIC  
  2.  "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"  
  3.  "http://java.sun.com/dtd/web-app_2_3.dtd" >  
  4.   
  5. <web-app>  
  6.   <display-name>Archetype Created Web Application</display-name>  
  7.   <context-param>  
  8.         <param-name>contextConfigLocation</param-name>  
  9.         <param-value>classpath*:applicationContext*.xml</param-value>  
  10.     </context-param>  
  11.   <!--  
  12.       
  13.     <context-param>      
  14.       
  15.         <param-name>resteasy.scan.resources</param-name>      
  16.         <param-value>true</param-value>  
  17.     </context-param>      
  18.     -->  
  19.   <listener>  
  20.       <listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>  
  21.    </listener>  
  22.   
  23. <listener>  
  24.     <listener-class>org.jboss.resteasy.plugins.spring.SpringContextLoaderListener</listener-class>  
  25.   </listener>  
  26.    <servlet>  
  27.       <servlet-name>Resteasy</servlet-name>  
  28.       <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>  
  29.    </servlet>  
  30.   
  31.    <servlet-mapping>  
  32.       <servlet-name>Resteasy</servlet-name>  
  33.       <url-pattern>/*</url-pattern>  
  34.    </servlet-mapping>  
  35.     
  36. </web-app>  
相比原来的配置文件多了

[html] view plaincopy
  1. <listener-class>org.jboss.resteasy.plugins.spring.SpringContextLoaderListener</listener-class>  

[html] view plaincopy
  1. <context-param>  
  2.         <param-name>contextConfigLocation</param-name>  
  3.         <param-value>classpath*:applicationContext*.xml</param-value>  
  4.     </context-param>  

3.application.xml的配置

[html] view plaincopy
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans  
  5. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ">   
  6.     <!-- service point -->  
  7.     <bean id="testServicePoint" class="com.jd.interfacce.service.point.TestServicePoint">  
  8.         <property name="manager" ref="manager" />  
  9.     </bean>  
  10.     <!-- MANAGER -->  
  11.     <bean id="manager" class="com.jd.interfacce.manager.impl.ManagerImpl"/>  
  12. </beans>  
其中
[html] view plaincopy
  1. testServicePoint  

是我们的资源resouce也就是发布接口的类

4.资源类

[java] view plaincopy
  1. package com.jd.interfacce.service.point;  
  2.   
  3. import javax.ws.rs.GET;  
  4. import javax.ws.rs.Path;  
  5. import javax.ws.rs.PathParam;  
  6.   
  7. import com.jd.interfacce.manager.Manager;  
  8. /** 
  9.  * service point endpoint 
  10.  * @author  
  11.  * 
  12.  */  
  13. @Path(value = "/")  
  14. public class TestServicePoint {  
  15.     Manager manager;  
  16.       
  17.     @GET  
  18.     @Path(value = "/echo/{message}")  
  19.     public String getMessage(@PathParam(value = "message") String message)  
  20.     {  
  21. //      return message;  
  22.         return manager.getMessage(message);  
  23.     }  
  24.       
  25.     public Manager getManager() {  
  26.         return manager;  
  27.     }  
  28.     public void setManager(Manager manager) {  
  29.         this.manager = manager;  
  30.     }  
  31. }  
5.manager类

[java] view plaincopy
  1. package com.jd.interfacce.manager.impl;  
  2.   
  3. import com.jd.interfacce.manager.Manager;  
  4.   
  5. public class ManagerImpl implements Manager{  
  6.     @Override  
  7.     public String getMessage(String message)  
  8.     {  
  9.         return message;  
  10.     }  
  11. }  

利用resteasy框架构建rest webservice----第五波:java代码调用乱码解决方案

今天主要介绍下当URI中出现中文时,服务端获取出得Pathparam为乱码的问题:
[java] view plaincopy
  1. String urlResouce = null;  
  2.         try {  
  3.             urlResouce = "http://10.28.0.203:8080/cloud-storeage-boss/cai:dafile/"+URLEncoder.encode("中文eclipse.zip","utf-8");  
  4.         } catch (UnsupportedEncodingException e1) {  
  5.             // TODO Auto-generated catch block  
  6.             e1.printStackTrace();  
  7.         } // create URL  
  8.         File localFile = new File("Z:\\tools\\eclipse-jee-helios-SR2-win32.zip");  
  9.         try{  
  10.               
  11.         HttpURLConnection urlConnection =  
  12.         (HttpURLConnection) (new URL(urlResouce)).openConnection();  
  13.         urlConnection.setRequestProperty("Charset""UTF-8");  
  14.         urlConnection.setRequestProperty("auth""maomaocaicai");  
  15.         urlConnection.setDoInput(true);  
  16.         urlConnection.setDoOutput(true);  
  17.         urlConnection.setRequestMethod("PUT");  
  18.         OutputStream urlOutputStream = urlConnection.getOutputStream();  
  19.         FileInputStream fileInputStream = new FileInputStream(localFile);  
  20.         IOUtils.copy(fileInputStream, urlOutputStream);  
  21.         fileInputStream.close();  
  22.         urlOutputStream.close();  
  23.         System.out.println(urlConnection.getResponseCode());  
  24.         }  
  25.         catch(Exception e)  
  26.         {  
  27.             e.printStackTrace();  
  28.         }  
乱码参数的解决方法很简单,就是将相应URI进行UTF-8的编码

这个原理比较简单因为中文时两个字节,而在网络进行传输的时候由于某种原因(具体原因就是编码的问题,请google)会进行单字节的编码,解析出来的中文就变乱码了。----浏览器在传输的时候都会对中文进行编码传输

实现文件下载

基于resteasy下载的实现,先贴出下载的代码

[java] view plaincopy
  1. /** 
  2.      * 下载对象 
  3.      * @param bucketName 
  4.      * @param objectName 
  5.      * @param request 
  6.      * @return 
  7.      */  
  8.     @Path(value = "/{bucketName}/{objectName}")  
  9.     @GET  
  10.     @Produces(MediaType.APPLICATION_OCTET_STREAM)  
  11.     public Response downloadObject(@PathParam(value = "bucketName") String bucketName,@PathParam(value = "objectName") String objectName,@Context HttpServletRequest request)  
  12.     {  
  13.         BucketObject bucketObject = objectManager.downloadObject(request.getHeader(CommonConstant.USER_TOKEN),CommonsUtil.generateSummary(request), bucketName, objectName);  
  14.         //直接返回输出流  
  15.         return Response.ok(new BigFileOutputStream(bucketObject.getDataStream())).build();  

这段代码比较简单:重点关注响应的实体类BigFileOutputStream,其传入的构造参数是一个输入流

该类的具体实现如下,其实关键的需要实现javax.ws.rs.core.StreamingOutput类,重写其write方法,将你得数据输出到write方法中得输出流中即可,resteasy框架会将其流直接输出到客户端

[java] view plaincopy
  1. /** 
  2.  * 实现用于直接响应一个输出流 
  3.  * @author maomao 
  4.  * 
  5.  */  
  6. public class BigFileOutputStream implements javax.ws.rs.core.StreamingOutput {  
  7.     private InputStream inputStream;  
  8.     public BigFileOutputStream(){}  
  9.     public BigFileOutputStream(InputStream inputStream)  
  10.     {  
  11.         this.inputStream = inputStream;  
  12.     }  
  13.       
  14.     @Override  
  15.     public void write(OutputStream output) throws IOException,  
  16.             WebApplicationException {  
  17.         // TODO Auto-generated method stub  
  18.         IOUtils.copy(inputStream, output);  
  19.     }  
  20.       
  21.     public InputStream getInputStream() {  
  22.         return inputStream;  
  23.     }  
  24.     public void setInputStream(InputStream inputStream) {  
  25.         this.inputStream = inputStream;  
  26.     }  
  27.       
  28. }  
客户端调用代码如下
[java] view plaincopy
  1. //下载文件  
  2.     private void downLoadObject()  
  3.     {  
  4.         String bucket = "EBOXTEST123456"//上传的桶  
  5.         String objectName = "wangpan114daitupian.png"//上传的对象名  
  6.         String urlResouce =  bucket + "/" + objectName;  
  7.         String baseURL = "http://10.28.1.37:8080/application_interface_manager/platform/";  
  8.         String hostURL = baseURL + urlResouce ;  
  9.         String httpMethod = "GET";  
  10.         String requestDate = new Date().toString();  
  11.     try{  
  12.         File localFile = new File("x:\\1142.png");  
  13.         //生成摘要用于签名  
  14.         String summary = httpMethod + "\n" // create StringToSign  
  15.         + "\n" // no Content-Md5 Filed  
  16.         + "\n" // no Content-Type Filed  
  17.         + requestDate + "\n" // Date Filed---must  
  18.         + urlResouce; //must  
  19.     //创建客户端签名  
  20.     String clientToken = new CreateSignTokenImpl().getToken(summary,secretKey);  
  21.     HttpURLConnection urlConnection =  
  22.     (HttpURLConnection) (new URL(hostURL)).openConnection();  
  23.     urlConnection.setRequestProperty("Token""jingdong "+accessKey+":"+clientToken);  
  24.     urlConnection.setRequestProperty("Date", requestDate);  
  25.     urlConnection.setDoInput(true);  
  26.     urlConnection.setRequestMethod(httpMethod);  
  27.       
  28.     InputStream is = urlConnection.getInputStream();  
  29. //  FileUtils.copyInputStreamToFile(is, localFile);  
  30.     try {  
  31.         OutputStream op = new FileOutputStream(localFile);  
  32.         byte [] bts = new byte[1024];  
  33.         int n = 0;  
  34.         while(-1 != (n = is.read(bts)))  
  35.         {  
  36.             op.write(bts, 0, n);  
  37.         }  
  38. //      op.close();  
  39.         } catch (IOException e1) {  
  40.         // TODO Auto-generated catch block  
  41.         e1.printStackTrace();  
  42.     }  
  43.     System.out.println(urlConnection.getResponseCode());  
  44.     }  
  45.     catch(Exception e)  
  46.     {  
  47.         e.printStackTrace();  
  48.     }  
  49.     }  

其实看着复杂,实际上很多代码不重要(偷懒把项目客户端调用代码直接copy过来了),关键就是从HttpUrlConnect处获取输入流(即是服务端输出流输出的数据),将其写入到文件即可

我的Demo

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.test.service</groupId>  <artifactId>RestEasyDemo1</artifactId>  <packaging>war</packaging>  <version>0.0.1-SNAPSHOT</version>  <name>RestEasyDemo1 Maven Webapp</name>  <url>http://maven.apache.org</url>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>    <!-- RestEasy的Maven依赖 -->     <!-- core library -->   <dependency>      <groupId>org.jboss.resteasy</groupId>      <artifactId>resteasy-jaxrs</artifactId>      <version>2.2.1.GA</version>   </dependency>   <!-- optional modules -->   <!-- JAXB support -->   <dependency>      <groupId>org.jboss.resteasy</groupId>      <artifactId>resteasy-jaxb-provider</artifactId>      <version>2.2.1.GA</version>   </dependency>      <!-- 添加json的支持 -->   <dependency><groupId>org.jboss.resteasy</groupId><artifactId>resteasy-jackson-provider</artifactId><version>2.2.1.GA</version>    </dependency>   <!-- multipart/form-data and multipart/mixed support -->   <dependency>      <groupId>org.jboss.resteasy</groupId>      <artifactId>resteasy-multipart-provider</artifactId>      <version>2.2.1.GA</version>   </dependency>     </dependencies>  <build>        <finalName>RestEasyDemo1</finalName>          <plugins>              <plugin>                  <groupId>org.apache.maven.plugins</groupId>                  <artifactId>maven-compiler-plugin</artifactId>                  <configuration>                      <source>1.6</source>                      <target>1.6</target>                  </configuration>              </plugin>              <plugin>          <groupId>org.apache.tomcat.maven</groupId>          <artifactId>tomcat6-maven-plugin</artifactId>          <version>2.0</version>         </plugin>          </plugins>      </build> </project>

web.xml

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><!-- Auto scan REST service --><!-- 自动扫描Service类会报错,这是一个bug,推荐使用手动的 --><!-- <context-param><param-name>resteasy.scan</param-name><param-value>true</param-value></context-param> --><!-- 手动注册Service类 --> <context-param>          <param-name>resteasy.resources</param-name>          <param-value>com.easytest.service.Library,com.easytest.service.MessageRestService</param-value>      </context-param> <!-- this need same with resteasy servlet url-pattern --><!-- <context-param><param-name>resteasy.servlet.mapping.prefix</param-name><param-value>/rest</param-value></context-param> --> <listener><listener-class>org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class></listener> <servlet><servlet-name>resteasy-servlet</servlet-name><servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class></servlet> <servlet-mapping><servlet-name>resteasy-servlet</servlet-name><url-pattern>/*</url-pattern></servlet-mapping></web-app>

服务类:

import java.io.File;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import javax.ws.rs.FormParam;import javax.ws.rs.GET;import javax.ws.rs.POST;import javax.ws.rs.Path;import javax.ws.rs.PathParam;import javax.ws.rs.Produces;import org.jboss.resteasy.annotations.GZIP;import org.jboss.resteasy.annotations.providers.multipart.PartType;import org.omg.IOP.MultipleComponentProfileHelper;@Path(value = "/captcha")  public class CaptchaService {/** * 获取验证码 * @param id * @return */@GET      @Path(value = "/{reqId}/get.htm")@GZIP@Produces("image/png")public File fehchCaptach(@PathParam("reqId") String reqId){System.out.println(reqId);return new File("D:\\testFTP\\suzhou\\00080200201401040007\\tailored\\BIRTH17_00282529128900101.png");}/** * 保存验证码 * @param reqId * @param captcha * @return */@POST    @Path(value = "/post.htm")  @Produces("application/json")public Map<String,String> saveCaptach(@FormParam("reqId") String reqId,@FormParam("captcha") String captcha){System.out.println(reqId+" = "+captcha);Map<String,String> map = new HashMap<String,String>();map.put("reqId", reqId);map.put("status", "true");map.put("msg", "successfully!");return map;}/** * 反馈某时间段验证码输入情况(正确/错误) * @param beginDate 开始日期(yyyymmdd) * @param endDate 截止日期(yyyymmdd) * @return */@GET    @Path(value = "/{beginDate}/{endDate}/feedback.htm")@Produces("application/json")public List<Map<String,String>> feedback(@PathParam("beginDate") String beginDate,@PathParam("endDate") String endDate){List<Map<String,String>> list = new ArrayList<Map<String,String>>();Map<String,String> map = new HashMap<String,String>();map.put("reqId", "650fce42dd024983b7e1b6a1a1e0b873");map.put("result", "YES");list.add(map);map = new HashMap<String,String>();map.put("reqId", "25a1df5e9fce4af1bc7f7dcd379d63bb");map.put("result", "YES");list.add(map);map = new HashMap<String,String>();map.put("reqId", "cb82aa3387b9489d89bac9f963e5c09c");map.put("result", "NO");list.add(map);return list;}@GET    @Path(value = "/feedback/confirm.htm")public void confirm(@PathParam("beginDate") String beginDate,@PathParam("endDate") String endDate){}}

package com.easytest.service;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;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.Response;import com.easytest.bean.Person;@Path("/message")public class MessageRestService {@GET@Path("/{param}")public Response printMessage(@PathParam("param") String msg) { String result = "Restful example : " + msg; return Response.status(200).entity(result).build(); }@GET@Path("/person/{param}")@Produces("application/json")public  List<Map<String,String>> getPerson(){Person p = new Person();p.setId("1111");p.setName("Jack");p.setAge(22);p.setAddress("浦东");List<Map<String, String>> list = new ArrayList<Map<String,String>>();Map<String, String> map = new HashMap<String, String>();map.put("id",p.getId() );map.put("name", p.getName());map.put("age", p.getAge()+"");map.put("address", p.getAddress());map.put("photo", p.getPhoto());list.add(map);return list;}}


0 0