原地址:http://blog.csdn.net/unei66/article/details/12324353


本文包括apache cxf rest的基本例子,文件上传,form提交和json提交。

1. 新建java project,导入apache cxf中lib下的所有jar包,项目目录如下:

Apache CXF REST example _Apache CXF REST exam

2. 基本例子

2.1 项目代码

IBookService.java

[java] view plaincopy

  1. package com.unei.service;  

  2.   

  3. import java.util.List;  

  4.   

  5. import javax.ws.rs.GET;  

  6. import javax.ws.rs.HeaderParam;  

  7. import javax.ws.rs.MatrixParam;  

  8. import javax.ws.rs.Path;  

  9. import javax.ws.rs.PathParam;  

  10. import javax.ws.rs.QueryParam;  

  11. import javax.ws.rs.core.Response;  

  12.   

  13. /** 

  14.  * basic examples 

  15.  * @author Administrator 

  16.  */  

  17. @Path("/book")  

  18. public interface IBookService {  

  19.     @GET  

  20.     public Response getBooks();  

  21.       

  22.     /** 

  23.      * @PathParam 测试 

  24.      * @param id 

  25.      * @return 

  26.      */  

  27.     @GET  

  28.     @Path("/id/{id}")  

  29.     public Response getBook(@PathParam("id")int id);  

  30.       

  31.     /** 

  32.      * @QueryParam 测试 

  33.      * url:http://localhost:9000/rest/book/page?from=1&to=10&order=sadf 

  34.      * @param from 

  35.      * @param to 

  36.      * @return 

  37.      */  

  38.     @GET  

  39.     @Path("/page")  

  40.     public Response getBookById(  

  41.             @QueryParam("from")int from,   

  42.             @QueryParam("to")int to,  

  43.             @QueryParam("order")List<String> order);  

  44.       

  45.     /** 

  46.      * @MatrixParam 测试 

  47.      * url:http://localhost:9000/rest/book/matrix/2013;author=tom;country=china 

  48.      * @param year 

  49.      * @param author 

  50.      * @param country 

  51.      * @return 

  52.      */  

  53.     @GET  

  54.     @Path("/matrix/{year}")  

  55.     public Response getBookByMatrix(@PathParam("year")String year,  

  56.             @MatrixParam("author")String author,  

  57.             @MatrixParam("country")String country);  

  58.     /** 

  59.      * @HeaderParam 测试 

  60.      * 获取http头信息 

  61.      * url:http://localhost:9000/rest/book/getHeader 

  62.      * @param userAgent 

  63.      * @return 

  64.      */  

  65.     @GET  

  66.     @Path("/getHeader")  

  67.     public Response getHeader(@HeaderParam("user-agent")String userAgent);  

  68. }  


BookService.java

[java] view plaincopy

  1. package com.unei.service.impl;  

  2.   

  3. import java.io.File;  

  4. import java.io.FileNotFoundException;  

  5. import java.io.FileOutputStream;  

  6. import java.io.IOException;  

  7. import java.io.InputStream;  

  8. import java.io.OutputStream;  

  9. import java.util.List;  

  10.   

  11. import javax.ws.rs.core.Response;  

  12. import javax.ws.rs.core.Response.ResponseBuilder;  

  13.   

  14. import org.apache.cxf.jaxrs.ext.multipart.Attachment;  

  15.   

  16. import com.unei.service.IBookService;  

  17.   

  18. public class BookService implements IBookService{  

  19.   

  20.     @Override  

  21.     public Response getBooks() {  

  22.         System.out.println("getBooks is called...");  

  23.         return Response.ok().entity("").build();  

  24.     }  

  25.   

  26.     @Override  

  27.     public Response getBook(int id) {  

  28.         System.out.println("getBook is called...");  

  29.         return Response.ok().entity(id).build();  

  30.     }  

  31.   

  32.     @Override  

  33.     public Response getBookById(int from  

  34.             , int to,List<String> order){  

  35.         System.out.println("getBookById is called...");  

  36.         return Response.ok().entity("from "+from+" to "+to+" order by "+order.toString()).build();  

  37.     }  

  38.   

  39.     @Override  

  40.     public Response getBookByMatrix(String year, String author, String country) {  

  41.         System.out.println("getBookByMatrix is called...");  

  42.         return Response.ok().entity("year:"+year+",author:"+author+",country:"+country).build();  

  43.     }  

  44.   

  45.     @Override  

  46.     public Response getHeader(String userAgent) {  

  47.         System.out.println("getHeader is called...");  

  48.         return Response.ok().entity(userAgent).build();  

  49.     }  

  50.   

  51.       

  52.   

  53.       

  54. }  


2.2 测试

启动服务器(Server.java)后,在浏览器中输入代码注释中的url。


3. 文件上传下载,form提交

3.1 程序代码

IUploadService.java

[java] view plaincopy

  1. package com.unei.service;  

  2.   

  3. import java.util.List;  

  4.   

  5. import javax.servlet.http.HttpServletRequest;  

  6. import javax.ws.rs.Consumes;  

  7. import javax.ws.rs.GET;  

  8. import javax.ws.rs.POST;  

  9. import javax.ws.rs.Path;  

  10. import javax.ws.rs.Produces;  

  11. import javax.ws.rs.core.Context;  

  12. import javax.ws.rs.core.Response;  

  13.   

  14. import org.apache.cxf.jaxrs.ext.multipart.Attachment;  

  15. import org.apache.cxf.jaxrs.ext.multipart.Multipart;  

  16.   

  17. /** 

  18.  * 文件上传service 

  19.  * @author Administrator 

  20.  * 

  21.  */  

  22. @Path("/upload")  

  23. public interface IUploadService {  

  24.     /** 

  25.      * 文本文档下载 

  26.      * url:http://localhost:9000/rest/upload/dlText 

  27.      * @return 

  28.      */  

  29.     @GET  

  30.     @Path("dlText")  

  31.     @Produces("text/plain")  

  32.     public Response downloadText();  

  33.       

  34.     /** 

  35.      * 表单提交,文件上传 

  36.      * @return 

  37.      */  

  38.     @POST  

  39.     @Path("/upload")  

  40.     @Consumes("multipart/form-data")  

  41.     public Response uploadFileByForm(  

  42.             @Multipart(value="id",type="text/plain")String id,  

  43.             @Multipart(value="name",type="text/plain")String name,  

  44.             @Multipart(value="file",type="p_w_picpath/png")Attachment p_w_picpath);  

  45.       

  46.     /** 

  47.      * 多文件上传 

  48.      * @param attchments 

  49.      * @param request 

  50.      * @return 

  51.      */  

  52.     @POST  

  53.     @Path("/uploadlist")  

  54.     @Consumes("multipart/form-data")  

  55.     public Response uploadFileList(List<Attachment>p_w_uploads,@Context HttpServletRequest request);  

  56. }  


UploadService.java

[java] view plaincopy

  1. package com.unei.service.impl;  

  2.   

  3. import java.io.ByteArrayOutputStream;  

  4. import java.io.File;  

  5. import java.io.FileNotFoundException;  

  6. import java.io.FileOutputStream;  

  7. import java.io.IOException;  

  8. import java.io.InputStream;  

  9. import java.io.OutputStream;  

  10. import java.util.Iterator;  

  11. import java.util.List;  

  12. import java.util.Map;  

  13.   

  14. import javax.activation.DataHandler;  

  15. import javax.servlet.http.HttpServletRequest;  

  16. import javax.ws.rs.core.MediaType;  

  17. import javax.ws.rs.core.Response;  

  18. import javax.ws.rs.core.Response.ResponseBuilder;  

  19.   

  20. import org.apache.cxf.jaxrs.ext.multipart.Attachment;  

  21.   

  22. import com.unei.service.IUploadService;  

  23.   

  24. public class UploadService implements IUploadService {  

  25.     @Override  

  26.     public Response downloadText() {  

  27.         File file = new File("D:\\test.txt");  

  28.         ResponseBuilder response = Response.ok(file);  

  29.         response.header("Content-Disposition""p_w_upload;filename='test.txt'");  

  30.         return response.build();  

  31.     }  

  32.   

  33.     @Override  

  34.     public Response uploadFileByForm(String id, String name, Attachment p_w_picpath) {  

  35.         System.out.println("id:" + id);  

  36.         System.out.println("name:" + name);  

  37.         DataHandler dh = p_w_picpath.getDataHandler();  

  38.   

  39.         try {  

  40.             InputStream ins = dh.getInputStream();  

  41.             writeToFile(ins, "D:\\upload\\" + dh.getName());  

  42.         } catch (Exception e) {  

  43.             e.printStackTrace();  

  44.         }  

  45.   

  46.         return Response.ok().entity("ok").build();  

  47.     }  

  48.   

  49.     @Override  

  50.     public Response uploadFileList(List<Attachment> p_w_uploads,  

  51.             HttpServletRequest request) {  

  52.         if (p_w_uploads.size() > 0)  

  53.             System.out.println("ok");  

  54.   

  55.         for (Attachment attach : p_w_uploads) {  

  56.             DataHandler dh = attach.getDataHandler();  

  57.             System.out.println(attach.getContentType().toString());  

  58.   

  59.             if (attach.getContentType().toString().equals("text/plain")) {  

  60.                 try {  

  61.                     System.out.println(dh.getName());  

  62.                     System.out.println(writeToString(dh.getInputStream()));  

  63.                 } catch (Exception e) {  

  64.                     e.printStackTrace();  

  65.                 }  

  66.             } else {  

  67.                 try {  

  68.                     writeToFile(dh.getInputStream(),  

  69.                             "D:\\upload\\" + dh.getName());  

  70.                 } catch (IOException e) {  

  71.                     e.printStackTrace();  

  72.                 }  

  73.             }  

  74.         }  

  75.         return Response.ok().entity("ok").build();  

  76.     }  

  77.   

  78.     private void writeToFile(InputStream ins, String path) {  

  79.         try {  

  80.             OutputStream out = new FileOutputStream(new File(path));  

  81.             int read = 0;  

  82.             byte[] bytes = new byte[1024];  

  83.   

  84.             while ((read = ins.read(bytes)) != -1) {  

  85.                 out.write(bytes, 0, read);  

  86.             }  

  87.             out.flush();  

  88.             out.close();  

  89.         } catch (FileNotFoundException e) {  

  90.             e.printStackTrace();  

  91.         } catch (IOException e) {  

  92.             e.printStackTrace();  

  93.         }  

  94.     }  

  95.   

  96.     private String writeToString(InputStream ins) throws Exception {  

  97.         ByteArrayOutputStream out = new ByteArrayOutputStream();  

  98.         byte[] b = new byte[1024];  

  99.         int i = -1;  

  100.         while ((i = ins.read(b)) != -1) {  

  101.             out.write(b, 0, i);  

  102.         }  

  103.         ins.close();  

  104.         return new String(out.toByteArray(), "UTF-8");  

  105.     }  

  106. }  


3.2 测试

测试使用两种方法,一种使用html页面,另一种使用HttpClient测试。

3.2.1 html测试代码:

uploadFileByForm.html

[html] view plaincopy

  1. <!DOCTYPE html>  

  2. <html>  

  3. <head>  

  4. <meta charset="UTF-8">  

  5. <title>Insert title here</title>  

  6. </head>  

  7. <body>  

  8.     <form action="http://localhost:9000/rest/upload/upload" method="post" enctype="multipart/form-data" >  

  9.         <p>id:<input type="text" name="id"/></p>  

  10.         <p>name:<input type="text" name="name"/></p>  

  11.         <p>p_w_picpath:<input type="file" name="file"/>  

  12.         <p><input type="submit" value="sub"/></p>  

  13.     </form>  

  14. </body>  

  15. </html>  

uploadFileList.html

[html] view plaincopy

  1. <!DOCTYPE html>  

  2. <html>  

  3. <head>  

  4. <meta charset="UTF-8">  

  5. <title>Insert title here</title>  

  6. </head>  

  7. <body>  

  8.     <form action="http://localhost:9000/rest/upload/uploadlist" method="post" enctype="multipart/form-data" >  

  9.         <p>id:<input type="text" name="id"/></p>  

  10.         <p>name:<input type="text" name="name"/></p>  

  11.         <p>p_w_picpath:<input type="file" name="file"/></p>  

  12.         <p>p_w_picpath2:<input type="file" name="file2"/></p>  

  13.         <p><input type="submit" value="sub"/></p>  

  14.     </form>  

  15. </body>  

  16. </html>  


3.2.2 html测试

启动服务器后(server.java),提交表单

3.2.3 HttpClient 测试

3.2.3.1 新建java project项目,添加apache cxf/lib 中所有jar包,项目结构如下

Apache CXF REST example _Apache CXF REST exam_02

额外添加jar包:

httpmime-4.2.3.jar

apache-mime4j-core-0.7.2.jar

3.2.3.2 项目代码

Client.java

[java] view plaincopy

  1. package com.unei.app;  

  2.   

  3. import java.io.File;  

  4. import java.nio.charset.Charset;  

  5.   

  6. import org.apache.http.client.HttpClient;  

  7. import org.apache.http.client.methods.HttpPost;  

  8. import org.apache.http.entity.mime.MultipartEntity;  

  9. import org.apache.http.entity.mime.content.FileBody;  

  10. import org.apache.http.entity.mime.content.StringBody;  

  11. import org.apache.http.impl.client.DefaultHttpClient;  

  12.   

  13.   

  14. public class Client {  

  15.   

  16.     public static void main(String[] args) throws Exception {  

  17.         MultipartEntity entity=new MultipartEntity();  

  18.         entity.addPart("id",new StringBody("newid", Charset.forName("UTF-8")));  

  19.         entity.addPart("name",new StringBody("newName",Charset.forName("UTF-8")));  

  20.         entity.addPart("file1",new FileBody(new File("D:\\test.txt")));  

  21.           

  22.         HttpPost request=new HttpPost("http://localhost:9000/rest/upload/uploadlist");  

  23.         request.setEntity(entity);  

  24.         HttpClient client=new DefaultHttpClient();  

  25.         client.execute(request);  

  26.     }  

  27.   

  28. }  


4. json提交

4.1 代码

Book.java

[java] view plaincopy

  1. package com.unei.bean;  

  2.   

  3. import javax.xml.bind.annotation.XmlRootElement;  

  4.   

  5. @XmlRootElement(name = "book")  

  6. public class Book {  

  7.     private int bookId;  

  8.     private String bookName;  

  9.   

  10.     public int getBookId() {  

  11.         return bookId;  

  12.     }  

  13.   

  14.     public void setBookId(int bookId) {  

  15.         this.bookId = bookId;  

  16.     }  

  17.   

  18.     public String getBookName() {  

  19.         return bookName;  

  20.     }  

  21.   

  22.     public void setBookName(String bookName) {  

  23.         this.bookName = bookName;  

  24.     }  

  25.       

  26.     public String toString(){  

  27.         return "[bookId:"+bookId+"],[bookName:"+bookName+"]";  

  28.     }  

  29. }  


IJsonService.java

[java] view plaincopy

  1. package com.unei.service;  

  2.   

  3. import java.util.List;  

  4.   

  5. import javax.ws.rs.Consumes;  

  6. import javax.ws.rs.POST;  

  7. import javax.ws.rs.Path;  

  8. import javax.ws.rs.core.Response;  

  9.   

  10. import com.unei.bean.Book;  

  11.   

  12. @Path("/json")  

  13. public interface IJsonService {  

  14.     /** 

  15.      * JSON提交 

  16.      * url:http://localhost:9000/rest/json/addBook 

  17.      * Json format:{"book":{"bookId":123,"bookName":"newBook"}} 

  18.      * @param book 

  19.      * @return 

  20.      */  

  21.     @POST  

  22.     @Path("/addBook")  

  23.     @Consumes("application/json")  

  24.     public Response addBook(Book book);  

  25.       

  26.     /** 

  27.      * Json提交2 

  28.      * url:http://localhost:9000/rest/json/addBooks 

  29.      * Json format:{"book":[{"bookId":123,"bookName":"newBook"},{"bookId":456,"bookName":"newBook2"}]} 

  30.      * @param books 

  31.      * @return 

  32.      */  

  33.     @POST  

  34.     @Path("/addBooks")  

  35.     @Consumes("application/json")  

  36.     public Response addBooks(List<Book> books);  

  37. }  


JsonService.java

[java] view plaincopy

  1. package com.unei.service.impl;  

  2.   

  3. import java.util.List;  

  4.   

  5. import javax.ws.rs.core.Response;  

  6.   

  7. import com.unei.bean.Book;  

  8. import com.unei.service.IJsonService;  

  9.   

  10. public class JsonService implements IJsonService{  

  11.   

  12.     @Override  

  13.     public Response addBook(Book book) {  

  14.         System.out.println("addBook is called...");  

  15.         return Response.ok().entity(book.toString()).build();  

  16.     }  

  17.   

  18.     @Override  

  19.     public Response addBooks(List<Book> books) {  

  20.         System.out.println("addBooks is called...");  

  21.         return Response.ok().entity("ok").build();  

  22.     }  

  23.   

  24. }  


4.2 测试

测试使用Firefox扩展程序poster。

测试1:

Apache CXF REST example _Apache CXF REST exam_03

Apache CXF REST example _Apache CXF REST exam_04

测试2:

Apache CXF REST example _Apache CXF REST exam_05

Apache CXF REST example _Apache CXF REST exam_06


5.服务器启动代码

Server.java

[java] view plaincopy

  1. package com.unei.app;  

  2.   

  3. import java.util.ArrayList;  

  4. import java.util.List;  

  5.   

  6. import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;  

  7. import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;  

  8. import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;  

  9.   

  10. import com.unei.service.impl.BookService;  

  11. import com.unei.service.impl.JsonService;  

  12. import com.unei.service.impl.UploadService;  

  13.   

  14. public class Server {  

  15.   

  16.     @SuppressWarnings({ "unchecked""rawtypes" })  

  17.     public Server() {  

  18.         JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();  

  19.         List clazzs=new ArrayList();  

  20.         clazzs.add(BookService.class);  

  21.         clazzs.add(UploadService.class);  

  22.         clazzs.add(JsonService.class);  

  23.         sf.setResourceClasses(clazzs);  

  24.         List<ResourceProvider> rps=new ArrayList<ResourceProvider>();  

  25.         for(int i=0;i<clazzs.size();i++)  

  26.             rps.add(new SingletonResourceProvider(clazzs.get(i)));  

  27.           

  28.         sf.setResourceProviders(rps);  

  29. //      sf.getInInterceptors().add(new LoggingInInterceptor());  

  30. //      sf.getOutInterceptors().add(new LoggingOutInterceptor());  

  31.         sf.setAddress("http://localhost:9000/rest");  

  32.         sf.create();  

  33.     }  

  34.   

  35.     public static void main(String[] args) throws Exception {  

  36.         new Server();  

  37.         System.out.println("server ready...");  

  38.         Thread.sleep(5*6000*1000);  

  39.         System.out.println("server existing");  

  40.         System.exit(0);  

  41.     }