`

apache wink rest学习(配置、编码、调用)

 
阅读更多

        最近接触新的项目,项目中远程接口用的是rest wink,以前项目对于这种需求基本都是webservice去实现的,今天特意对rest wink进行了理论研究和实际编码工作,所以记录记录下来以便后面查阅。理论部分看到一篇好文章,这里就直接引用下好了,文章地址:https://www.oschina.net/question/5189_8593


REST 代表 Representational State Transfer,它是 World Wide Web 所依赖的一套架构原则。Roy Fielding 在他的博士论文 “Architectural Styles and the Design of Network-based Software Architectures” 中首次提出了这个概念。在他的论文中,Fielding 明确指出 REST 和 World Wide Web 的五个架构原则:
可寻址性(Addressability)。REST 中的所有东西都基于资源 的概念。资源与 OOP 中的对象或其他名词不同,它是一种抽象,必须可以通过 URI 寻址或访问。
接口一致性(Interface uniformity)。与 SOAP 或其他标准不同,REST 要求用来操纵资源的方法或动词不是任意的。这意味着 RESTful 服务的开发人员只能使用 HTTP 支持的方法,比如 GET、PUT、POST、DELETE 等等。因此不需要使用 WSDL 等服务描述语言。
无状态(Statelessness)。为了增强可伸缩性,服务器端不存储客户机的状态信息。这使服 务器不与特定的客户机相绑定,负载平衡变得简单多了。这还让服务器更容易监视、更可靠。
具象(Representational)。客户机总是与资源的某种具象交互,绝不会直接与资源本身 交互。同一资源还可以有多个具象。理论上说,持有资源的具象的任何客户机应该有操纵底层资源的足够信息。
连通性(Connectedness)。任何基于 REST 的系统都应该预见到客户机需要访问相关的资源,应该在返回的资源具象中包含这些资源。例如,可以以超链接的形式包含特定 RESTful 服务的操作序列中的相关步骤,让客户机可以根据需要访问它们。


       为什么需要另一个 Java 标准?定义 JAX-RS 这个新规范是为了简化基于 REST 的 Java 开发。它主要关注使用 Java 注释和普通旧式 Java 对象 (POJO) 实现 RESTful 服务。尽管总是可以使用 servlet 实现 RESTful 服务,但是以这种方式实现业务逻辑需要太多 HTTP GET 请求。
JAX-RS 隐藏所有 HTTP 并把 servlet 绑定到 Java 类中的各个方法。注释还可以动态地提取 HTTP 请求中的信息,以及把应用程序生成的异常映射到 HTTP 响应码。由于这些原因,JAX-RS 是一种实现 RESTful Java Web 服务的有效方法。
     我已经介绍了 REST 和 JAX-RS,现在开始讨论 Apache Wink。Apache Wink 1.0 是一个从头设计的完全兼容的 JAX-RS 1.0 规范实现。它很容易使用和应用于生产环境,它提供的特性可以增强核心 JAX-RS 规范。
      Apache Wink 运行时架构是 JAX-RS 1.0 规范的简单实现。Apache Wink 部署在 Java Platform, Enterprise Edition (Java EE) 环境中,由以下三个组件组成:
Apache Wink RestServlet。RestServlet 在 Web 应用程序的 Java EE web.xml 描述符文件中配置。这个 servlet 作为所有 HTTP Web 服务请求的主入口点,它把请求和响应对象实例分派给请求处理器进行进一步处理。
请求处理器。RequestProcessor 是核心 Apache Wink 引擎,它由 Apache Wink RestServlet 初始化。请求处理器使用请求 URI 寻找、匹配和调用相应的资源类和方法。在请求处理期间发生的任何异常都会导致 RequestProcessor 调用 Error Handler Chain 以处理异常。
资源。在 REST 中,代表 Web 服务的任何组件或对象都被称为资源。资源 允许通过它的许多具象之一获取和操纵数据。实现资源的 POJO 被称为资源类。资源类进一步实现资源方法,资源方法实际处理底层业务 逻辑。
Apache Wink逻辑图



 

下面是我今天利用rest wink做的一个对外暴露远程接口的例子:

1.所需jar包间下截图



 

2.配置web.xml

这里的配置包含了rest wink与spring的整合,这里代码我用的是截图,源码在附件中

 

3.配置rest.xml



 

4.编写接口类

package rest;

import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.json.JSONException;
import org.json.JSONObject;

import common.Logger;

/**
 * rest接口测试案例类
 * @author 峰
 *
 */
@Path("/jeff/test")
public class RestWinkTest {
 private static Logger log=Logger.getLogger(RestWinkTest.class);
 
 /**
  * 方法描述:测试rest接口POST方式
  * @param type  类型
  * @param content  附加内容
  * @param info  json格式内容
  * @return
  */
 @POST
 @Path("/testget/{type}/{content}")
 @Produces(MediaType.APPLICATION_JSON)
 public JSONObject testRestGetAPI(@PathParam("type") int type,@PathParam("content") String content,JSONObject info){
  log.info("调用路径为:http://localhost:8080/jeff/test/testget/----------调用方式为POST");
  JSONObject resultJson = new JSONObject();
  resultJson=info;
  try {   
   resultJson.put("type", type);
   resultJson.put("content",content);
  } catch (JSONException e) {
   e.printStackTrace();
  }
  log.info("调用完成");
  return resultJson;
 }

 

/**
  * 方法描述:本地main方法调用远程接口测试
  * @param agrs
  * @throws IOException
  */
 public static void main(String[] agrs) throws IOException{
  String reqUrl="http://localhost:8080/rest/jeff/test/testget/2/中国";
  JSONObject inputobj=new JSONObject();
  HttpURLConnection conn=null;
  OutputStreamWriter opsw=null;
  InputStream inpus=null;
  ByteArrayOutputStream baops=null;
  try {
   //参数拼装
   inputobj.put("key",MD5.MD5Encode("FRIST KEY!"));
   inputobj.put("value",MD5.MD5Encode(reqUrl));
   String inputjsonstr=inputobj.toString();
   log.info(inputjsonstr);
   //通过java.net下URL类进行地址调用
   URL url=new URL(reqUrl);
   conn=(HttpURLConnection)url.openConnection();
   conn.setRequestMethod("POST");
   //设置超时
   conn.setReadTimeout(10000);
   conn.setConnectTimeout(10000);
   //设置返回参数和调用参数类型
   conn.addRequestProperty("content-type","application/json");
   conn.setDoOutput(true);
   conn.setUseCaches(false);
   opsw=new OutputStreamWriter(conn.getOutputStream(),"UTF-8");
   opsw.write(inputjsonstr);
   opsw.flush();
   //获取远程接口返回结果,并进行解析
   inpus=conn.getInputStream();
   baops=new ByteArrayOutputStream();
   byte[] btbuffer=new byte[1024];
   int len=0;
   while ((len = inpus.read(btbuffer)) != -1)
            {
    baops.write(btbuffer, 0, len);
            }
            byte[] data = baops.toByteArray();
            log.info("调用完成,返回结果为:"+new String(data, "utf-8"));
  } catch (Exception e) {
   e.printStackTrace();
  }finally{
   if(opsw!=null)opsw.close();
   if(inpus!=null)inpus.close();
   if(baops!=null)baops.close();
  }  
 }

}

 

5.远程接口测试

接口调用我采用的是firefox的restclient插件进行调用,见下图:



 



 

 

附注:

因为时间有限,所以接口类我只写了一个post类型,其他还有很多其他类型,比如


具体这些类型用法都差不多,我推荐一篇文章,里面有很好的介绍,我看着很全了。

地址:
 http://wenda.bmob.cn/?/question/51

 

 

  • 大小: 15.3 KB
  • 大小: 16.9 KB
  • 大小: 27.2 KB
  • 大小: 6.9 KB
  • 大小: 51.5 KB
  • 大小: 43.8 KB
  • 大小: 2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics