一、REST统一接口

   REST通过统一的接口方式获取客户端资源,其中主要包括:GET、POST、DELETE、PUT方法。以下是GET方法和POST方法的实例:

/**
	 * @QueryParam为主要通过键值对取参数值
	 * @param request
	 * @param id
	 * @param name
	 * @param gender
	 * @return
	 */
	@GET//以GET的方式进行接口调用
	@Path("find")//接口路径
	@Produces("applications/json")
	public Object publicMicroblog(@Context HttpServletRequest request,
			@QueryParam("id") @DefaultValue("") String id,//主要通过键值对这样取
			@QueryParam("name") @DefaultValue("") String name, 
			@QueryParam("gender") @DefaultValue("0") int gender){
		User user = new User();
		user.setName(name);
		user.setId(id);
		user.setGender(gender);
		System.out.println("GET=============="+user.getName());
		return user;
	}
	
	@POST//以POST的方式进行接口构建
	@Path("update")//接口路径
	@Produces("application/json")
	public Object updateMicroblog(@Context HttpServletRequest request,
			@QueryParam("id") @DefaultValue("") String id,
			@QueryParam("name") @DefaultValue("") String name, 
			@QueryParam("gender") @DefaultValue("0") int gender){
		User user = new User();
		user.setName(name);
		user.setId(id);
		user.setGender(gender);
		System.out.println("POST=================="+user.getName());
		return user;
	}

二、资源定位

  Jersey具有一定的参数格式获取参数数值。主要有:@QueryParam(主要通过键值对取参数值),@FormParam(以表单的方式获取参数),@PathParam(将参数作为接口路径的一部分进行组合),@BeanParam(自定义一个参数组合实例),@CookieParam(匹配cookie中的键值对),@Context(注解来获取上下文参数(ServletContext,ServletRequest,ServletResponse),获取请求头信息,获取请求处理信息)。实例如下:

  

	@POST//以POST的方式进行接口构建
	@Path("update")//接口路径
	@Produces("application/json")
	public Object updateMicroblog(@Context HttpServletRequest request,
			@QueryParam("id") @DefaultValue("") String id,
			@QueryParam("name") @DefaultValue("") String name, 
			@QueryParam("gender") @DefaultValue("0") int gender){
		User user = new User();
		user.setName(name);
		user.setId(id);
		user.setGender(gender);
		System.out.println("POST=================="+user.getName());
		return user;
	}
	
	/**
	 * @PathParam将参数作为接口路径的一部分进行组合
	 */
	@Path("comment/{name}")
	@POST
	@Produces("application/json")
	public Object commentByName(@PathParam("name") String name,
			@QueryParam("id") String id,@QueryParam("gender") int gender){
		User user = new User();
		user.setName(name);
		user.setId(id);
		user.setGender(gender);
		System.out.println("@PathParam=================="+user.getName());
		return user;
	}
	
	/**
	 * @FormParam将以表单的形式传递参数
	 */
	@Path("commentupdate")
	@POST
	@Produces("application/json")
	public Object updateComment(@FormParam("name") String name,
			@FormParam("id") String id,@FormParam("gender") int gender){
		User user = new User();
		user.setName(name);
		user.setId(id);
		user.setGender(gender);
		System.out.println("@FormParam=================="+user.getName());
		return user;
	}
	
	/**
	 * @BeanParam将自定义一个参数组合实例
	 */
	@Path("savecomment")
	@POST
	@Produces("application/json")
	public Object saveComment(@BeanParam User user){
		System.out.println("@BeanParam=================="+user.getName());
		return user;
	}
	
	/**
	 * @CookieParam匹配cookie中的键值对
	 */
	@Path("findcomments")
	@POST
	@Produces("application/json")
	public LinkedList<User> findComments(@CookieParam("name") String name,
			@CookieParam("id") String id){
		User user = new User();
		user.setId(id);
		user.setName(name);
		System.out.println("@CookieParam=================="+user.getName());
		LinkedList<User> list = new LinkedList<User>();
		list.add(user);
		return list;
	}
	
	/**
	 * @Context注解来获取上下文参数(ServletContext,ServletRequest,ServletResponse),获取请求头信息,获取请求处理信息,
	 */
	@Path("savemicroblog")
	@POST
	@Produces("application/json")
	public void saveMicroblog(@Context HttpServletRequest request,
			@Context HttpHeaders headers,@Context ServletContext ctx,
			@Context Request request2){
		String name = (String) request.getAttribute("name");
		System.out.println("@Context========httpservletrequest=========="+name);
		System.out.println("@Context========headers=========="+headers.getHeaderString("token"));
		System.out.println("@Context========servletcontext=========="+ctx);
		System.out.println("@Context========request=========="+request2);
	}

三、传输格式

  在传入的参数中可以包含基本数据类型、文件类型、InputStream类型、Reader类型和JSON类型等。实例如下:

/**
	 * 传入文件类型
	 * @throws IOException 
	 */
	@Path("uploadfile")
	@POST
	public void uploadfile(File file) throws IOException{
		try(BufferedReader br = new BufferedReader(new FileReader(file))){
			String s;
			do {
				s = br.readLine();
				System.out.println("========file=========="+s);
			} while (s != null);
		}
	}
	
	/**
	 * 参数为InputStream类型
	 * @throws IOException 
	 */
	@Path("input")
	@POST
	public void inputfile(InputStream inputStream) throws IOException{
		try(BufferedReader br = new BufferedReader(new InputStreamReader(inputStream))){
			String s;
			do {
				s = br.readLine();
				System.out.println("========inputStream=========="+s);
			} while (s != null);
		}
	}
	
	/**
	 * 参数为reader类型
	 * @throws IOException 
	 */
	@Path("reader")
	@POST
	public void readerfile(Reader reader) throws IOException{
		try(BufferedReader br = new BufferedReader(reader)){
			String s;
			do {
				s = br.readLine();
				System.out.println("========inputStream=========="+s);
			} while (s != null);
		}
	}

四、内容协商

  在服务端设计接口时,需要与客户端协商接收数据的方式和响应数据的方式。接收数据的方式以@Consumes注解进行协商,响应数据的格式以注解@Produces进行协商。实例如下:

/**
	 * @Consumes将参数以一定的格式进行接收
	 * @Produces将结果以一定的格式进行输出
	 */
	@MyBindingFilter
	@Path("json")
	@POST
	@Consumes("application/json")
	@Produces("application/json")
	public User findMicroblogByName(User user){
		User user1 = new User();
		user1.setName(user.getName());
		user1.setOrgLongName(user.getOrgLongName());
		System.out.println("===========json========="+user.getName());
		return user;
	}