zhangxinba 发表于 2018-11-22 08:07:52

Apache CXF REST example

  原地址:http://blog.csdn.net/unei66/article/details/12324353
  本文包括apache cxf rest的基本例子,文件上传,form提交和json提交。
1. 新建java project,导入apache cxf中lib下的所有jar包,项目目录如下:
http://img.blog.csdn.net/20131006003554765?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdW5laTY2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
2. 基本例子
2.1 项目代码
  IBookService.java
   view plaincopy

[*]  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 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
   view plaincopy

[*]  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 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
   view plaincopy

[*]  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(Listattachments,@Context HttpServletRequest request);
[*]  }
  UploadService.java
   view plaincopy

[*]  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 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;
[*]
[*]  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;
[*]  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
   view plaincopy

[*]  
[*]  
[*]  
[*]  
[*]  Insert title here
[*]  
[*]  
[*]  
[*]  id:
[*]  name:
[*]  image:
[*]  
[*]  
[*]  
[*]  
  uploadFileList.html
   view plaincopy

[*]  
[*]  
[*]  
[*]  
[*]  Insert title here
[*]  
[*]  
[*]  
[*]  id:
[*]  name:
[*]  image:
[*]  image2:
[*]  
[*]  
[*]  
[*]  
3.2.2 html测试
  启动服务器后(server.java),提交表单
3.2.3 HttpClient 测试
  3.2.3.1 新建java project项目,添加apache cxf/lib 中所有jar包,项目结构如下
http://img.blog.csdn.net/20131006005251796?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdW5laTY2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
  需额外添加jar包:
  httpmime-4.2.3.jar
  apache-mime4j-core-0.7.2.jar
  3.2.3.2 项目代码
  Client.java
   view plaincopy

[*]  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
   view plaincopy

[*]  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 ",";
[*]  }
[*]  }
  IJsonService.java
   view plaincopy

[*]  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 books);
[*]  }
  JsonService.java
   view plaincopy

[*]  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 books) {
[*]  System.out.println("addBooks is called...");
[*]  return Response.ok().entity("ok").build();
[*]  }
[*]
[*]  }
4.2 测试
  测试使用Firefox扩展程序poster。
  测试1:
http://img.blog.csdn.net/20131006010135703?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdW5laTY2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
http://img.blog.csdn.net/20131006010124140?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdW5laTY2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
  测试2:
http://img.blog.csdn.net/20131006010152218?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdW5laTY2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
http://img.blog.csdn.net/20131006010207531?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdW5laTY2/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center
5.服务器启动代码
  Server.java
   view plaincopy

[*]  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 rps=new ArrayList();
[*]  for(int i=0;i
页: [1]
查看完整版本: Apache CXF REST example