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);}}
- Apache CXF REST example
- Apache CXF REST example
- Apache CXF REST example
- Apache CXF REST api
- Apache CXF JAX-WS example
- Apache CXF Spring SOAP example
- Apache CXF Spring SOAP MTOM example
- Apache CXF Spring SOAP Handler example
- Apache CXF + Spring3 + REST + JSON配置
- CXF Rest
- 使用Apache CXF搭建REST风格的Web Service
- apache-cxf-3.0.4和spring实现rest服务
- Apache CXF REST 文件上传,form提交和json提交。
- Apache CXF REST 文件上传,中文乱码(已解决)
- 如何部署 apache CXF rest app to Weblogic
- REST service example using CXF 2.2, JAX-RS 1.0, JAXB and Spring
- CXF Rest Server
- CXF Rest Client
- 人人网2012 年校招Android 笔试题
- android:gravity和android:layout_gravity
- UKICPC
- Android 之 下拉框(Spinner)的使用
- Eclipse+PyDev
- Apache CXF REST example
- UVALive 4959 Jumping monkey
- 软件架构师的12项修炼_读书纪要_P3商务技能修炼
- 用二级指针操作不带头结点的单链表
- Fluent 批量添加线面、点面、平面的scheme实现
- 数据结构----作业1--LinearList
- 【笔试&面试】GSC——Java开发
- SSL 接收到一个超出最大准许长度的记录【ssl_error_rx_record_too_long】
- Windows8 离线安装.NET3.5