Apache CXF REST example

来源:互联网 发布:数据库导入excle 编辑:程序博客网 时间:2024/05/03 21:13

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

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

2. 基本例子

2.1 项目代码

IBookService.java

package com.unei.service;import java.util.List;import javax.ws.rs.GET;import javax.ws.rs.HeaderParam;import javax.ws.rs.MatrixParam;import javax.ws.rs.Path;import javax.ws.rs.PathParam;import javax.ws.rs.QueryParam;import javax.ws.rs.core.Response;/** * basic examples * @author Administrator */@Path("/book")public interface IBookService {@GETpublic Response getBooks();/** * @PathParam 测试 * @param id * @return */@GET@Path("/id/{id}")public Response getBook(@PathParam("id")int id);/** * @QueryParam 测试 * url:http://localhost:9000/rest/book/page?from=1&to=10&order=sadf * @param from * @param to * @return */@GET@Path("/page")public Response getBookById(@QueryParam("from")int from, @QueryParam("to")int to,@QueryParam("order")List<String> order);/** * @MatrixParam 测试 * url:http://localhost:9000/rest/book/matrix/2013;author=tom;country=china * @param year * @param author * @param country * @return */@GET@Path("/matrix/{year}")public Response getBookByMatrix(@PathParam("year")String year,@MatrixParam("author")String author,@MatrixParam("country")String country);/** * @HeaderParam 测试 * 获取http头信息 * url:http://localhost:9000/rest/book/getHeader * @param userAgent * @return */@GET@Path("/getHeader")public Response getHeader(@HeaderParam("user-agent")String userAgent);}

BookService.java

package com.unei.service.impl;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.List;import javax.ws.rs.core.Response;import javax.ws.rs.core.Response.ResponseBuilder;import org.apache.cxf.jaxrs.ext.multipart.Attachment;import com.unei.service.IBookService;public class BookService implements IBookService{@Overridepublic Response getBooks() {System.out.println("getBooks is called...");return Response.ok().entity("").build();}@Overridepublic Response getBook(int id) {System.out.println("getBook is called...");return Response.ok().entity(id).build();}@Overridepublic Response getBookById(int from, int to,List<String> order){System.out.println("getBookById is called...");return Response.ok().entity("from "+from+" to "+to+" order by "+order.toString()).build();}@Overridepublic Response getBookByMatrix(String year, String author, String country) {System.out.println("getBookByMatrix is called...");return Response.ok().entity("year:"+year+",author:"+author+",country:"+country).build();}@Overridepublic Response getHeader(String userAgent) {System.out.println("getHeader is called...");return Response.ok().entity(userAgent).build();}}

2.2 测试

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


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

3.1 程序代码

IUploadService.java

package com.unei.service;import java.util.List;import javax.servlet.http.HttpServletRequest;import javax.ws.rs.Consumes;import javax.ws.rs.GET;import javax.ws.rs.POST;import javax.ws.rs.Path;import javax.ws.rs.Produces;import javax.ws.rs.core.Context;import javax.ws.rs.core.Response;import org.apache.cxf.jaxrs.ext.multipart.Attachment;import org.apache.cxf.jaxrs.ext.multipart.Multipart;/** * 文件上传service * @author Administrator * */@Path("/upload")public interface IUploadService {/** * 文本文档下载 * url:http://localhost:9000/rest/upload/dlText * @return */@GET@Path("dlText")@Produces("text/plain")public Response downloadText();/** * 表单提交,文件上传 * @return */@POST@Path("/upload")@Consumes("multipart/form-data")public Response uploadFileByForm(@Multipart(value="id",type="text/plain")String id,@Multipart(value="name",type="text/plain")String name,@Multipart(value="file",type="image/png")Attachment image);/** * 多文件上传 * @param attchments * @param request * @return */@POST@Path("/uploadlist")@Consumes("multipart/form-data")public Response uploadFileList(List<Attachment>attachments,@Context HttpServletRequest request);}

UploadService.java

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

try{}finally{ 

//关闭流

}

package com.unei.service.impl;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.Iterator;import java.util.List;import java.util.Map;import javax.activation.DataHandler;import javax.servlet.http.HttpServletRequest;import javax.ws.rs.core.MediaType;import javax.ws.rs.core.Response;import javax.ws.rs.core.Response.ResponseBuilder;import org.apache.cxf.jaxrs.ext.multipart.Attachment;import com.unei.service.IUploadService;public class UploadService implements IUploadService {@Overridepublic Response downloadText() {File file = new File("D:\\test.txt");ResponseBuilder response = Response.ok(file);response.header("Content-Disposition", "attachment;filename='test.txt'");return response.build();}@Overridepublic Response uploadFileByForm(String id, String name, Attachment image) {System.out.println("id:" + id);System.out.println("name:" + name);DataHandler dh = image.getDataHandler();try {InputStream ins = dh.getInputStream();writeToFile(ins, "D:\\upload\\" + dh.getName());} catch (Exception e) {e.printStackTrace();}return Response.ok().entity("ok").build();}@Overridepublic Response uploadFileList(List<Attachment> attachments,HttpServletRequest request) {if (attachments.size() > 0)System.out.println("ok");for (Attachment attach : attachments) {DataHandler dh = attach.getDataHandler();System.out.println(attach.getContentType().toString());if (attach.getContentType().toString().equals("text/plain")) {try {System.out.println(dh.getName());System.out.println(writeToString(dh.getInputStream()));} catch (Exception e) {e.printStackTrace();}} else {try {writeToFile(dh.getInputStream(),"D:\\upload\\" + dh.getName());} catch (IOException e) {e.printStackTrace();}}}return Response.ok().entity("ok").build();}private void writeToFile(InputStream ins, String path) {try {OutputStream out = new FileOutputStream(new File(path));int read = 0;byte[] bytes = new byte[1024];while ((read = ins.read(bytes)) != -1) {out.write(bytes, 0, read);}out.flush();out.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}private String writeToString(InputStream ins) throws Exception {ByteArrayOutputStream out = new ByteArrayOutputStream();byte[] b = new byte[1024];int i = -1;while ((i = ins.read(b)) != -1) {out.write(b, 0, i);}ins.close();return new String(out.toByteArray(), "UTF-8");}}


3.2 测试

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

3.2.1 html测试代码:

uploadFileByForm.html

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><form action="http://localhost:9000/rest/upload/upload" method="post" enctype="multipart/form-data" ><p>id:<input type="text" name="id"/></p><p>name:<input type="text" name="name"/></p><p>image:<input type="file" name="file"/><p><input type="submit" value="sub"/></p></form></body></html>
uploadFileList.html

<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><form action="http://localhost:9000/rest/upload/uploadlist" method="post" enctype="multipart/form-data" ><p>id:<input type="text" name="id"/></p><p>name:<input type="text" name="name"/></p><p>image:<input type="file" name="file"/></p><p>image2:<input type="file" name="file2"/></p><p><input type="submit" value="sub"/></p></form></body></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
package com.unei.app;import java.io.File;import java.nio.charset.Charset;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.mime.MultipartEntity;import org.apache.http.entity.mime.content.FileBody;import org.apache.http.entity.mime.content.StringBody;import org.apache.http.impl.client.DefaultHttpClient;public class Client {public static void main(String[] args) throws Exception {MultipartEntity entity=new MultipartEntity();entity.addPart("id",new StringBody("newid", Charset.forName("UTF-8")));entity.addPart("name",new StringBody("newName",Charset.forName("UTF-8")));entity.addPart("file1",new FileBody(new File("D:\\test.txt")));HttpPost request=new HttpPost("http://localhost:9000/rest/upload/uploadlist");request.setEntity(entity);HttpClient client=new DefaultHttpClient();client.execute(request);}}

4. json提交

4.1 代码

Book.java
package com.unei.bean;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElement(name = "book")public class Book {private int bookId;private String bookName;public int getBookId() {return bookId;}public void setBookId(int bookId) {this.bookId = bookId;}public String getBookName() {return bookName;}public void setBookName(String bookName) {this.bookName = bookName;}public String toString(){return "[bookId:"+bookId+"],[bookName:"+bookName+"]";}}

IJsonService.java
package com.unei.service;import java.util.List;import javax.ws.rs.Consumes;import javax.ws.rs.POST;import javax.ws.rs.Path;import javax.ws.rs.core.Response;import com.unei.bean.Book;@Path("/json")public interface IJsonService {/** * JSON提交 * url:http://localhost:9000/rest/json/addBook * Json format:{"book":{"bookId":123,"bookName":"newBook"}} * @param book * @return */@POST@Path("/addBook")@Consumes("application/json")public Response addBook(Book book);/** * Json提交2 * url:http://localhost:9000/rest/json/addBooks * Json format:{"book":[{"bookId":123,"bookName":"newBook"},{"bookId":456,"bookName":"newBook2"}]} * @param books * @return */@POST@Path("/addBooks")@Consumes("application/json")public Response addBooks(List<Book> books);}

JsonService.java
package com.unei.service.impl;import java.util.List;import javax.ws.rs.core.Response;import com.unei.bean.Book;import com.unei.service.IJsonService;public class JsonService implements IJsonService{@Overridepublic Response addBook(Book book) {System.out.println("addBook is called...");return Response.ok().entity(book.toString()).build();}@Overridepublic Response addBooks(List<Book> books) {System.out.println("addBooks is called...");return Response.ok().entity("ok").build();}}

4.2 测试

测试使用Firefox扩展程序poster。
测试1:
测试2:

5.服务器启动代码

Server.java
package com.unei.app;import java.util.ArrayList;import java.util.List;import org.apache.cxf.jaxrs.JAXRSServerFactoryBean;import org.apache.cxf.jaxrs.lifecycle.ResourceProvider;import org.apache.cxf.jaxrs.lifecycle.SingletonResourceProvider;import com.unei.service.impl.BookService;import com.unei.service.impl.JsonService;import com.unei.service.impl.UploadService;public class Server {@SuppressWarnings({ "unchecked", "rawtypes" })public Server() {JAXRSServerFactoryBean sf = new JAXRSServerFactoryBean();List clazzs=new ArrayList();clazzs.add(BookService.class);clazzs.add(UploadService.class);clazzs.add(JsonService.class);sf.setResourceClasses(clazzs);List<ResourceProvider> rps=new ArrayList<ResourceProvider>();for(int i=0;i<clazzs.size();i++)rps.add(new SingletonResourceProvider(clazzs.get(i)));sf.setResourceProviders(rps);//sf.getInInterceptors().add(new LoggingInInterceptor());//sf.getOutInterceptors().add(new LoggingOutInterceptor());sf.setAddress("http://localhost:9000/rest");sf.create();}public static void main(String[] args) throws Exception {new Server();System.out.println("server ready...");Thread.sleep(5*6000*1000);System.out.println("server existing");System.exit(0);}}