- 浏览: 210263 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
xiaokang1582830:
这有涉及到跨域?
ajax跨域调用webservice -
337240552:
...
web.xml中<security-constraint>和四种认证类型 -
pythoner126com:
写得不错,国内对perl热情不是很高,我最近也有翻译,请多多指 ...
Perl Hash 用法 -
an_yeblack:
你好,我想问一下,一般是什么愿因导致这种错误的呢?先谢谢了!! ...
WAS7 无法在控制台启动 Node Agent -
linzixiao:
感谢分享
冻结table的行和列
from:http://www.ibm.com/developerworks/cn/webservices/ws-restajax/
简介:
基于 REST 的 Web 服务是使用 REpresentational State Transfer (REST) 体系结构风格构建的 Web 服务。本文介绍了一种编写基于 REST 的 Web 服务的方法,其中使用一个简单的代理 Servlet 和基于 Asynchronous XML + JavaScript (Ajax) 的客户端。
引言
在 Roy Fielding 的论文中,他将 REST 作为目前 Web 体系结构的一种基础概念进行了详细介绍,他为 REST 提出了下列标准:
为现代 Web 体系结构进行建模的一组约束。
REST 原则已应用于 HTTP 和 URI 规范。
在 HTTP 的发展过程中是可见的
REST 不是一种协议,而是一种体系结构风格,这是非常重要的区别
常识告诉我们,Web 服务主要用于计算机与计算机之间的通信,而不是计算机与用户之间的通信。基于 REST 的 Web 服务是使用 REST 体系结构风格创建的 Web 服务,下一个部分中将通过一个示例来说明如何构建基于 REST 的 Web 服务。要掌握这一内容,您首先需要了解 Ajax,这是很重要的.
创建基于 REST 的 Web 服务
要创建基于 REST 的 Web 服务,您首先需要确定希望作为 Web 服务进行公开的所有资源。一些资源的示例包括雇员列表、雇员详细信息、订购单,等等。在 REST 中,每种资源都是通过唯一的统一资源标识符(Uniform Resource Identifier,URI)来标识的。您需要为每种资源确定唯一的 URI。例如,雇员列表可以标识如下:http://www.employee-details.com/employees-list。雇员详细信息可以使用如下所示的 URI 进行标识:http://www.employee-details.com/employees/01234。
使用 HTTP 操作 GET、PUT、POST 和 DELETE 以检索和修改您的资源。在您的资源表示中提供一些超链接,以提供更多的相关信息。为这些资源的请求和响应数据指定格式,这需要 PUT 和 POST 操作。
图 1 中的关系图显示了与一个基于 REST 的 Web 服务之间的交互。
实现基于 REST 的 Web 服务
您可以使用 HTTP Servlet 来实现基于 REST 的 Web 服务。本文使用一个虚拟的服务演示了实现的过程,而这个服务提供了有关公司雇员的详细信息。雇员列表资源使用一个逻辑 URI 进行表示,http://localhost:9080/AJAX_REST_Demo/RESTDemoServlet/employee-list。当通过 HTTP GET 调用这个服务时,它将返回如清单 1 中所示的雇员列表
清单 1. 使用 HTTP GET 调用雇员列表
类似地,雇员详细信息可以使用一个逻辑 URI 进行表示,如 http://localhost:9080/AJAX_REST_Demo/RESTDemoServlet/employee/0124。当通过 HTTP GET 调用这个服务时,它将返回如清单 2 中所示的雇员详细信息。
清单 2. 使用 HTTP GET 调用雇员详细信息
清单 3 显示了这个 Servlet 的代码。其中,所有操作都采用了硬编码方式,但是可以很容易地将其扩展为与数据库进行交互,以便成为一个实时的、基于 REST 的服务。
清单 3. Servlet 代码:
在下一个部分中,了解如何为这个基于 REST 的 Web 服务编写 Ajax 客户端。
为基于 REST 的 Web 服务编写 Ajax 客户端
如前所述,Ajax 表示 Asynchronous JavaScript + XML。它有时也称为 XML HTTP 技术。在 Ajax 中,核心的技术主要是围绕实现与服务器的异步通信,而无需页面刷新。XMLHTTPRequest 对象支持对服务器进行异步 GET、POST、PUT 和 DELETE。这并不向用户显示任何内容,换句话说,不会显示状态消息。您可以为状态更改指定一个处理程序方法,并且当发生如下请求时将通知这个处理程序:
初始化
启动
在返回的过程中
完全完成
清单 4 显示了一个基于 Ajax 的 HTML 页面的代码,它可以用作上述基于 REST 的 Web 服务的客户端:
清单 4. 基于 Ajax 的 HTML 页面的代码
在清单 4 中,当用户单击 getEmployee-List 按钮时,会向服务器发送一个 XML HTTP 请求。为 XML HTTP 请求指定使用处理程序函数 handleEmpListResponse 来处理 readyState 更改。当服务器完成了响应(readyState = 4)并且该响应为 OK 时,您可以解析 XML 并将其添加到页面的文档对象模型(Document Object Model,DOM)后面,以显示雇员列表。类似地,当用户单击 GetEmpDetails 按钮时,处理程序函数 handleEmpDetailResponse 将处理来自服务器的 XML 响应,并修改页面的 DOM 以显示特定雇员的详细信息
简介:
基于 REST 的 Web 服务是使用 REpresentational State Transfer (REST) 体系结构风格构建的 Web 服务。本文介绍了一种编写基于 REST 的 Web 服务的方法,其中使用一个简单的代理 Servlet 和基于 Asynchronous XML + JavaScript (Ajax) 的客户端。
引言
在 Roy Fielding 的论文中,他将 REST 作为目前 Web 体系结构的一种基础概念进行了详细介绍,他为 REST 提出了下列标准:
为现代 Web 体系结构进行建模的一组约束。
REST 原则已应用于 HTTP 和 URI 规范。
在 HTTP 的发展过程中是可见的
REST 不是一种协议,而是一种体系结构风格,这是非常重要的区别
常识告诉我们,Web 服务主要用于计算机与计算机之间的通信,而不是计算机与用户之间的通信。基于 REST 的 Web 服务是使用 REST 体系结构风格创建的 Web 服务,下一个部分中将通过一个示例来说明如何构建基于 REST 的 Web 服务。要掌握这一内容,您首先需要了解 Ajax,这是很重要的.
创建基于 REST 的 Web 服务
要创建基于 REST 的 Web 服务,您首先需要确定希望作为 Web 服务进行公开的所有资源。一些资源的示例包括雇员列表、雇员详细信息、订购单,等等。在 REST 中,每种资源都是通过唯一的统一资源标识符(Uniform Resource Identifier,URI)来标识的。您需要为每种资源确定唯一的 URI。例如,雇员列表可以标识如下:http://www.employee-details.com/employees-list。雇员详细信息可以使用如下所示的 URI 进行标识:http://www.employee-details.com/employees/01234。
使用 HTTP 操作 GET、PUT、POST 和 DELETE 以检索和修改您的资源。在您的资源表示中提供一些超链接,以提供更多的相关信息。为这些资源的请求和响应数据指定格式,这需要 PUT 和 POST 操作。
图 1 中的关系图显示了与一个基于 REST 的 Web 服务之间的交互。
实现基于 REST 的 Web 服务
您可以使用 HTTP Servlet 来实现基于 REST 的 Web 服务。本文使用一个虚拟的服务演示了实现的过程,而这个服务提供了有关公司雇员的详细信息。雇员列表资源使用一个逻辑 URI 进行表示,http://localhost:9080/AJAX_REST_Demo/RESTDemoServlet/employee-list。当通过 HTTP GET 调用这个服务时,它将返回如清单 1 中所示的雇员列表
清单 1. 使用 HTTP GET 调用雇员列表
<?xml version='1.0' encoding='UTF-8'?> <p:Employees xmlns:p='http://www.employee-details.com'> <Employee id='00345' href='/employees/00345'/> <Employee id='00346' href='/employees/00346'/> <Employee id='00347' href='/employees/00347'/> <Employee id='00348' href='/employees/00348'/> </p:Employees>
类似地,雇员详细信息可以使用一个逻辑 URI 进行表示,如 http://localhost:9080/AJAX_REST_Demo/RESTDemoServlet/employee/0124。当通过 HTTP GET 调用这个服务时,它将返回如清单 2 中所示的雇员详细信息。
清单 2. 使用 HTTP GET 调用雇员详细信息
<?xml version='1.0' encoding='UTF-8'?> < EmpDetail xmlns:p='http://www.employee-details.com'> <<Emp-ID>00345</Emp-ID> <Name>David Henry</Name> <Department>Finance</ Department > </p:EmpDetail>
清单 3 显示了这个 Servlet 的代码。其中,所有操作都采用了硬编码方式,但是可以很容易地将其扩展为与数据库进行交互,以便成为一个实时的、基于 REST 的服务。
清单 3. Servlet 代码:
public class RESTDemoServlet extends HttpServlet implements Servlet { /* (non-Java-doc) * @see javax.servlet.http.HttpServlet#HttpServlet() */ Map map =new HashMap(); /* (non-Javadoc) * @see javax.servlet.GenericServlet#init() */ public void init() throws ServletException { // TODO Auto-generated method stub super.init(); Employee emp0 =new Employee("David","Finance"); Employee emp1 =new Employee("Smith","HealthCare"); Employee emp2 =new Employee("Adam","Information technology"); Employee emp3 =new Employee("Stephan","Life Sciences"); map.put("00345",emp0); map.put("00346",emp1); map.put("00347",emp2); map.put("00348",emp3); } /* (non-Java-doc) * @see javax.servlet.http.HttpServlet#doGet (HttpServletRequest arg0, HttpServletResponse arg1) */ protected void doGet(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub arg1.setContentType("text/xml"); PrintWriter out=arg1.getWriter(); System.out.println(map); if(arg0.getPathInfo()!= null){ String EmpId=arg0.getPathInfo().substring(1,arg0.getPathInfo().length()); System.out.println(EmpId); out.write("<?xml version='1.0' encoding='UTF-8'? >"+"\n"); out.write("<p:EmpDetail xmlns:p='http://www.employee-details.com' >"+"\n"); out.write("<Emp-ID>"+EmpId+" </Emp-ID >"+"\n"); out.write("<Name>"+((Employee)map.get(EmpId)).name+" </Name >"+"\n"); out.write("<Department >"+((Employee)map.get(EmpId)).dept+" </Department >"+"\n"); out.write("</p:EmpDetail >"+"\n"); out.flush(); }else{ out.write("<?xml version='1.0' encoding='UTF-8'? >"+"\n"); out.write("<p:Employees xmlns:p='http://www.employee-details.com' >"+"\n"); out.write("<Employee id='00345' href='http://localhost:9080/ AJAX_REST_Demo/RESTDemoServlet/employees/00345'/ >"+"\n"); out.write("<Employee id='00346' href='http://localhost:9080/ AJAX_REST_Demo/RESTDemoServlet/employees/00346'/ >"+"\n"); out.write("<Employee id='00347' href='http://localhost:9080/ AJAX_REST_Demo/RESTDemoServlet/employees/00347'/ >"+"\n"); out.write("<Employee id='00348' href='http://localhost:9080/ AJAX_REST_Demo/RESTDemoServlet/employees/00348'/ >"+"\n"); out.write("</p:Employees >"); out.flush(); } } /* (non-Java-doc) * @see javax.servlet.http.HttpServlet#doPost (HttpServletRequest arg0, HttpServletResponse arg1) */ protected void doPost(HttpServletRequest arg0, HttpServletResponse arg1) throws ServletException, IOException { // TODO Auto-generated method stub } }
在下一个部分中,了解如何为这个基于 REST 的 Web 服务编写 Ajax 客户端。
为基于 REST 的 Web 服务编写 Ajax 客户端
如前所述,Ajax 表示 Asynchronous JavaScript + XML。它有时也称为 XML HTTP 技术。在 Ajax 中,核心的技术主要是围绕实现与服务器的异步通信,而无需页面刷新。XMLHTTPRequest 对象支持对服务器进行异步 GET、POST、PUT 和 DELETE。这并不向用户显示任何内容,换句话说,不会显示状态消息。您可以为状态更改指定一个处理程序方法,并且当发生如下请求时将通知这个处理程序:
初始化
启动
在返回的过程中
完全完成
清单 4 显示了一个基于 Ajax 的 HTML 页面的代码,它可以用作上述基于 REST 的 Web 服务的客户端:
清单 4. 基于 Ajax 的 HTML 页面的代码
<SCRIPT language="javascript" type="text/javascript" > var req=null; //This function initializes XHR function initXHR() { if (navigator.appName.indexOf("Microsoft") > -1 ) { try{ req=new ActiveXObject("Microsoft.XMLHTTP"); }catch(e1){ alert("failed to create XHR in IE"); } }else{ try{ req=new XMLHttpRequest(); }catch(error){ alert("failed to create XHR in FireFox"); } } } //get an employee detail function getEmpDetails(Empurl){ initXHR(); req.open("GET",Empurl, true); req.onreadystatechange=handleEmpDetailResponse; req.send(null); } //get employee list function getEmployeeList(listurl){ initXHR(); req.open("GET", listurl, true); req.onreadystatechange=handleEmpListResponse; req.send(null); } function handleEmpDetailResponse(){ //if Response is complete if(req.readyState==4){ //response is OK if(req.status==200){ var str=""; var response=req.responseXML; var root=response.documentElement; for(i=0;i <root.childNodes.length;i++){ if(root.childNodes[i].nodeType != 1) continue; var name=root.childNodes[i].nodeName; var value=root.childNodes[i].firstChild.nodeValue; str=str+name+"--- >"+value+" <br >"; } document.getElementById("emp-div").style.display=""; document.getElementById("emp-detail-div").innerHTML=str; }else{ document.getElementById("messageDiv").innerHTML=" <SPAN style='color:#FF0000; font-size:12pt; text-decoration:none;' <Invalid URL or PartId </SPAN >"; } req.abort(); } } function handleEmpListResponse(){ //if Response is complete if(req.readyState==4){ //response is OK if(req.status==200){ var pstr=""; var response=req.responseXML; var root=response.documentElement; for(i=0;i <root.childNodes.length;i++){ if(root.childNodes[i].nodeType != 1) continue; var id=root.childNodes[i].getAttribute("id"); var href=root.childNodes[i].getAttribute("href"); pstr=pstr+"EmpId"+"--- >"+id+" <input type='button' value=' GetEmpDetails' onclick="+'"'+"getEmpDetails('"+href+"')"+'"'+">"+" <br >"; } document.getElementById("emp-list-div").style.display=""; document.getElementById("emp-list").innerHTML=pstr; }else{ document.getElementById("messageDiv").innerHTML=" <SPAN style='color:#FF0000; font-size:12pt; text-decoration:none;' >Invalid Employee ID. </SPAN >"; } } } </SCRIPT > <center > <input type="button" value="getEmployee-List" onclick="getEmployeeList 'http://localhost:9080/AJAX_REST_Demo/RESTDemoServlet/employee-list')" > <br > <br > <div id="messageDiv" > </div > <div id="emp-list-div" style='color:#FF0000; font-size:12pt; text-decoration:none; display:none;' >Employee List : </div > <br > <div id="emp-list" > </div > <br > <br > <div id="emp-div" style='color:#FF0000; font-size:12pt; text-decoration:none; display:none;' >Selected Employee Detail : </div > <br > <div id="emp-detail-div" > </div > </center >
在清单 4 中,当用户单击 getEmployee-List 按钮时,会向服务器发送一个 XML HTTP 请求。为 XML HTTP 请求指定使用处理程序函数 handleEmpListResponse 来处理 readyState 更改。当服务器完成了响应(readyState = 4)并且该响应为 OK 时,您可以解析 XML 并将其添加到页面的文档对象模型(Document Object Model,DOM)后面,以显示雇员列表。类似地,当用户单击 GetEmpDetails 按钮时,处理程序函数 handleEmpDetailResponse 将处理来自服务器的 XML 响应,并修改页面的 DOM 以显示特定雇员的详细信息
发表评论
-
Java Client 请求Rest Service
2011-04-02 17:46 1514啥都不说了,下面见代码.有时间在发个一个从web端通过dojo ... -
Error 404: SRVE0190E: File not found: /login.action
2011-02-12 13:21 6590发生这样问题有两种情况。 (1)第一种,我的was是6.1, ... -
REST与IBM Product
2011-01-08 23:37 1202A 使用 WebSphere sMash 构建 RESTfu ... -
REST 与 Web 框架(五)构建 RESTful Web 服务
2011-01-08 23:30 1262REST 与 Restlet 框架简介 简介: 具象状态 ... -
REST 与 Web 框架(四)使用 Struts 2 开发 RESTful 服务
2011-01-08 23:27 1218from :http://www.ibm.com/develo ... -
REST 与 Web 框架(三)使用 PHP 在 CICS 上构建 REST 服务
2011-01-08 23:21 1133简介: CICS® Transaction Server® ... -
REST 与 Web 框架(二)REST on Rails
2011-01-08 23:19 897简介: 跨越边界 系列中以前的文章说 Ruby on Rai ... -
REST 与 Web 框架(一)使用 sqlRest 将数据库转换为 REST 风格的 Web 服务
2011-01-08 23:15 1388简介: 本文介绍 sqlRest 框架,它是一种高效的轻量级 ... -
REST与Web2.0(五):用 Geronimo 和 REST 构建服务器端 mashup
2011-01-08 23:07 1030使用 REST、Ajax 和 Apache Geronimo ... -
REST与Web2.0(四):使用 Twitter REST API
2011-01-08 22:38 1216简介: Twitter 无疑是 Wo ... -
REST与Web2.0(二):Ajax 和REST 第2部分
2011-01-08 21:28 842http://www.ibm.com/developerwor ... -
REST与Web2.0(一):Ajax 和REST 第一部分
2011-01-08 00:24 867Ajax/REST 架构风格对于融入式 Web 应用程序的优点 ... -
REST 基础(三):使用 WSDL 2.0 描述 REST Web 服务
2011-01-07 23:54 1524from:http://www.ibm.com/develop ... -
REST 基础(二):Web 服务编程,REST 与 SOAP
2011-01-07 23:27 966应用场景介绍(在线用 ... -
REST 基础(一):用于构建 RESTful Web 服务的多层架构
2011-01-07 23:03 1292from:http://www.ibm.com/develop ...
相关推荐
4. **富客户端应用(Rich Client Applications)**: REST支持AJAX(异步JavaScript和XML)技术,使得Web应用能提供类似桌面应用的用户体验,符合Web2.0富客户端的需求。 **Java在RESTful服务中的应用** 1. **JAX-...
在现代Web开发中,Web2.0的概念引入了更加互动和动态的用户体验,而AJAX(Asynchronous JavaScript and XML)和Web Service则是实现这一目标的关键技术。本文将深入探讨这两种技术在构建Web2.0应用中的核心作用以及...
在本资源中,"java web 2.0架构开发与项目实战 源代码01",我们聚焦于Java Web应用程序的开发,特别是在Web 2.0时代的技术和实践。Web 2.0是一个概念,它强调互联网作为交互式平台,用户参与度更高,社交网络和富...
《专业Web 2.0编程》是一本全面介绍Web 2.0技术及其应用的专业书籍。它不仅覆盖了基础知识和技术细节,还通过具体案例展示了如何将这些技术应用于实践中,是学习和掌握Web 2.0技术不可或缺的资源之一。对于希望深入...
虽然REST(Representational State Transfer)架构风格简化了某些类型服务的构建,尤其是那些面向互联网和Ajax客户端的服务,但SOAP、WSDL和WS-*规范在构建复杂、安全的服务时仍有其价值。对于数据密集型服务,将...
【精通ASP.NET2.0的Web2.0电子教程】是一个深入学习ASP.NET 2.0框架与Web2.0技术的教育资源,主要面向希望通过PPT形式进行学习的开发者。这个教程涵盖了ASP.NET 2.0的核心概念以及如何在Web应用程序中应用Web2.0的...
在Web 2.0应用中,REST允许客户端和服务器之间轻量级通信,提高性能和可扩展性。开发者可以使用PHP创建RESTful服务,通过URL定位资源,使用HTTP动词表示操作,使得接口更加清晰且易于理解。 Dojo是一个强大的...
在深入探讨“基于REST架构风格的Web+20实现”这一主题之前,需要先了解REST(Representational State Transfer)架构风格的基本概念以及Web 2.0的相关技术背景。 REST是一种软件架构风格,最初由Roy Fielding在他的...
- **Web服务基础**:介绍了Web服务的基本概念,包括SOAP和REST等通信协议。 - **在ASP.NET AJAX中调用Web服务**:展示了如何在ASP.NET AJAX应用程序中调用Web服务,并处理返回的数据。 #### 6. 更新面板 (Chapter 5...
- **背景**: REST(Representational State Transfer)是 Web 服务领域的一个重要概念,尤其在过去十年中,随着 Web 2.0 的发展而变得日益重要。REST 提供了一种简单且灵活的方式来构建 Web 服务,它使用诸如 HTTP ...
ASP.NET AJAX库(MicrosoftAjax.js和MicrosoftMvcAjax.js)提供了与REST服务交互的客户端API。通过异步调用,可以更新页面的部分内容,提高用户体验。 **7. 错误处理和状态码** 在构建REST服务时,应正确设置HTTP...
Web服务自动交互的爆炸式增长,即我们如今所称的Web2.0,已逐渐从个人用户之间,扩展到了网站、客户端应用程序以及企业数据库之间。我们才刚刚开始看到一个全球互联的复杂网络,其深度和广度难以完全理解。Web上的...
- 《JavaScript全程指南》覆盖了JavaScript的核心技术,结合Web2.0和Ajax,提供了深入学习的路径,包括JavaScript与浏览器的交互、高级技巧以及XML和Web服务的使用。 6. **CSS(Cascading Style Sheets)**: - ...
Mashup技术作为Web2.0时代兴起的一种新型Web应用程序,能够通过组合多种不同类型资源来创建新的服务,这一点在地理信息系统(GIS)的背景下尤为突出。文章详细介绍了使用RESTful服务架构和AJAX技术实现地理资源聚合...
ASP.NET Web API 2.0 是一个用于构建 HTTP 服务的框架,允许开发人员使用 .NET Framework 创建 RESTful API,以便与其他应用程序或服务进行数据交换。REST(Representational State Transfer)是一种架构风格,用于...
Mashup技术广泛应用于Web2.0时代的社会化媒体和无线应用中。 SOP(Same-Origin Policy)是一种Web浏览器的安全机制,规定了不同-origin域下的资源不能相互访问,以防止跨站脚本攻击。SOP机制可以通过JSONP、CORS等...
### Web 2.0参考架构概述 在《Web 2.0 Architectures, 1st Edition》这本书中,第五章“Chapter 5. A Reference Architecture for Developers”详细介绍了面向开发者的Web 2.0参考架构。这一章节是本书的核心部分之...
在本篇博文中,我们将深入探讨如何利用jQuery和Ajax技术与Restlet 2.0框架进行交互,实现对Restful资源的创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作,即CRUD操作。Restlet是一个开源的Java ...