Apache CXF REST api

来源:互联网 发布:奇迹归来坐骑进阶数据 编辑:程序博客网 时间:2024/05/22 12:52

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

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

2. 基本例子

2.1 项目代码

IBookService.Java

[java] view plain copy
  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 plain copy
  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 plain copy
  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="image/png")Attachment image);  
  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>attachments,@Context HttpServletRequest request);  
  56. }  

UploadService.java

注意一下代码中对流的处理(代码中处理是错误的,~~)

try{}finally{ 

//关闭流

}

[java] view plain copy
  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""attachment;filename='test.txt'");  
  30.         return response.build();  
  31.     }  
  32.   
  33.     @Override  
  34.     public Response uploadFileByForm(String id, String name, Attachment image) {  
  35.         System.out.println("id:" + id);  
  36.         System.out.println("name:" + name);  
  37.         DataHandler dh = image.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> attachments,  
  51.             HttpServletRequest request) {  
  52.         if (attachments.size() > 0)  
  53.             System.out.println("ok");  
  54.   
  55.         for (Attachment attach : attachments) {  
  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 plain copy
  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>image:<input type="file" name="file"/>  
  12.         <p><input type="submit" value="sub"/></p>  
  13.     </form>  
  14. </body>  
  15. </html>  
uploadFileList.html

[html] view plain copy
  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>image:<input type="file" name="file"/></p>  
  12.         <p>image2:<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包,项目结构如下
额外添加jar包:
httpmime-4.2.3.jar
apache-mime4j-core-0.7.2.jar
3.2.3.2 项目代码
Client.java
[java] view plain copy
  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 plain copy
  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 plain copy
  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 plain copy
  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:
测试2:

5.服务器启动代码

Server.java
[java] view plain copy
  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.     }  
  42. }  
0 0
原创粉丝点击