最近接触新的项目,项目中远程接口用的是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
相关推荐
通过上述知识点,我们可以理解如何在Spring环境中集成Apache Wink,以创建和管理REST服务。提供的源码和可执行文件可能包含了具体的示例项目,供开发者学习和参考。通过深入研究这些材料,开发者可以更好地掌握Wink...
这个"apache-wink-1.2.1-incubating.tar.gz"文件是一个归档文件,通常包含完整的Apache Wink框架的所有组件、库和必要的配置文件,方便用户在本地环境中部署和使用。 Apache Wink的核心特性包括: 1. **RESTful ...
这个"apache-wink-1.0-incubating.tar.gz"文件是Apache Wink项目在1.0版本孵化阶段的一个归档包,包含了完整的源代码、库文件和其他必要的资源,适合开发人员进行学习和开发工作。 Apache Wink由Apache软件基金会...
3. **JAX-RS兼容**:Apache Wink遵循Java API for RESTful Web Services (JAX-RS)规范,允许开发者使用注解来定义资源和操作,简化了REST服务的开发。 4. **客户端和服务器端支持**:Wink不仅提供了服务器端的实现...
这两个依赖分别用于服务器端的REST服务实现和客户端的REST调用。 ```xml <groupId>org.apache.wink <artifactId>wink-server <version>1.4.0-incubating <groupId>org.apache.wink <artifactId>wink-...
在实际使用Apache Wink时,开发者需要了解如何配置和启动Wink服务器,如何定义REST资源,以及如何利用Wink的客户端库进行服务调用。此外,熟悉JAX-RS规范和相关的HTTP概念也是必要的。对于初次接触RESTful Web服务的...
这个"apache-wink-1.1.1-incubating-src.tar.gz"文件是Apache Wink 1.1.1版本的源代码压缩包,适用于开发者进行深度定制和学习。在了解这个框架之前,我们需要先理解RESTful Web服务的概念。 REST...
9. **客户端支持**:除了服务器端,Wink还提供了强大的客户端支持,允许开发者在Java应用中方便地调用其他REST服务,处理响应和异常。 10. **社区支持**:作为Apache项目的一部分,Wink拥有活跃的社区,提供文档、...
"apache-wink-1.2.1-incubating-src.tar.gz"是Apache Wink 1.2.1版本的源代码压缩包,适用于开发者进行深度学习和定制。该文件使用了常见的Linux/Unix压缩格式`.tar.gz`,这通常意味着它是用`tar`命令打包,然后用`...
6. **客户端调用**:Wink也提供了客户端API,可以方便地测试和调用我们创建的REST服务。例如,我们可以创建一个`Client`对象,发送请求并获取响应。 通过上述步骤,你已经成功地用Maven和Wink创建了一个简单的REST...