Apache CXF REST example

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

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

Apache CXF REST example_第1张图片

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 {
	@GET
	public 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{

	@Override
	public Response getBooks() {
		System.out.println("getBooks is called...");
		return Response.ok().entity("").build();
	}

	@Override
	public Response getBook(int id) {
		System.out.println("getBook is called...");
		return Response.ok().entity(id).build();
	}

	@Override
	public 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();
	}

	@Override
	public 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();
	}

	@Override
	public 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 {
	@Override
	public 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();
	}

	@Override
	public 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();
	}

	@Override
	public 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包,项目结构如下
Apache CXF REST example_第2张图片
额外添加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{

	@Override
	public Response addBook(Book book) {
		System.out.println("addBook is called...");
		return Response.ok().entity(book.toString()).build();
	}

	@Override
	public Response addBooks(List<Book> books) {
		System.out.println("addBooks is called...");
		return Response.ok().entity("ok").build();
	}

}

4.2 测试

测试使用Firefox扩展程序poster。
测试1:
Apache CXF REST example_第3张图片
Apache CXF REST example_第4张图片
测试2:
Apache CXF REST example_第5张图片
Apache CXF REST example_第6张图片

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,json,form,REST,CXF,上传)