﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-每日一得-随笔分类-RubyOnRails</title><link>http://www.blogjava.net/alex/category/19422.html</link><description>不求多得,只求一得
about java,hibernate,spring,design,database,Ror,ruby,快速开发&lt;br/&gt;&lt;br/&gt;
最近关心的内容关键字:RoR
</description><language>zh-cn</language><lastBuildDate>Mon, 04 Jun 2007 00:06:07 GMT</lastBuildDate><pubDate>Mon, 04 Jun 2007 00:06:07 GMT</pubDate><ttl>60</ttl><item><title>rails 安装与升级</title><link>http://www.blogjava.net/alex/archive/2007/06/04/121709.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Sun, 03 Jun 2007 16:18:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/06/04/121709.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/121709.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/06/04/121709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/121709.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/121709.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/alex/archive/2007/06/04/121709.html'>阅读全文</a><img src ="http://www.blogjava.net/alex/aggbug/121709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-06-04 00:18 <a href="http://www.blogjava.net/alex/archive/2007/06/04/121709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>行万里路，读万卷书</title><link>http://www.blogjava.net/alex/archive/2007/05/29/120644.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 29 May 2007 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/05/29/120644.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/120644.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/05/29/120644.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/120644.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/120644.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/alex/archive/2007/05/29/120644.html'>阅读全文</a><img src ="http://www.blogjava.net/alex/aggbug/120644.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-05-29 11:32 <a href="http://www.blogjava.net/alex/archive/2007/05/29/120644.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>从&lt;应用Rails进行敏捷Web开发&gt;看设计过程</title><link>http://www.blogjava.net/alex/archive/2007/05/24/119566.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Thu, 24 May 2007 01:52:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/05/24/119566.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/119566.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/05/24/119566.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/119566.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/119566.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/alex/archive/2007/05/24/119566.html'>阅读全文</a><img src ="http://www.blogjava.net/alex/aggbug/119566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-05-24 09:52 <a href="http://www.blogjava.net/alex/archive/2007/05/24/119566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[zt]学习 REST</title><link>http://www.blogjava.net/alex/archive/2007/01/23/95440.html</link><dc:creator>Alex</dc:creator><author>Alex</author><pubDate>Tue, 23 Jan 2007 00:30:00 GMT</pubDate><guid>http://www.blogjava.net/alex/archive/2007/01/23/95440.html</guid><wfw:comment>http://www.blogjava.net/alex/comments/95440.html</wfw:comment><comments>http://www.blogjava.net/alex/archive/2007/01/23/95440.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/alex/comments/commentRss/95440.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/alex/services/trackbacks/95440.html</trackback:ping><description><![CDATA[
		<p>key words: REST webservice<br /><br />转自<a href="http://www.dualface.com/blog/?p=356" target="_blank">廖宇雷的Weblog</a></p>
		<div class="main" id="postitem">
				<p>REST 是由 Roy Fielding 在他的论文<a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm">《Architectural Styles and the Design of Network-based Software Architectures》</a>中提出的一个术语。</p>
				<p>REST 是英文 Representational State Transfer 的缩写，有中文翻译为“具象状态传输”（参考：<a href="http://dev2dev.bea.com.cn/bbsdoc/20060529259.html">《SIP/IMS网络中的Representational State Transfer (REST)和数据分布》</a>）。</p>
				<p>—————————————</p>
				<p>前面的内容比较枯燥，我说说我自己的理解。</p>
				<p>但是 REST 到底是什么呢？论文我看不懂，不过找到一篇更简单易懂的东西：<a href="http://www.xfront.com/REST-Web-Services.html">《Building Web Services the REST Way》</a>。</p>
				<p>根据这篇文章，我整理了一下我自己对 REST 的理解：</p>
				<p>
						<strong>REST 首先只是一种架构样式，不是一种标准</strong>。这点和 Ajax 类似，两者都是利用现有的成熟技术。</p>
				<p>在 REST 的定义中，一个 Web 应用总是<strong>使用固定的 URI 向外部世界呈现（或者说暴露）一个资源</strong>。</p>
				<blockquote>
						<p>URI 是英文 Uniform Resource Identifier 的缩写，中文翻译“通用资源标志符”。</p>
						<p>“通用资源标志符”是指<strong>唯一标识一个资源（xhtml 文件、图片、css 样式表）的字符串</strong>。当然了，RFC 中定义的 URI 复杂得多，不过我们此处将 URI 想象成一个人的身份证号码就行了（你不能有两个同时有效的身份证号码，一个号码也不可能同时对应两个人）。而我们天天挂在嘴边的 URL 地址就是 URI 的一种表现形式（个人理解，有错请纠正）。 </p>
				</blockquote>
				<p>知道什么是 URI 后，我们来看一个实际例子：</p>
				<p>http://www.example.com/photo/logo 指向 example.com 网站（可以视为一个 Web 应用）中类型为 photo，名字为 logo 的资源。我们用浏览器访问这个 URI，看到的将可能是一个 xhtml 文档，其中用 &lt;img src=”……” /&gt; 来显示实际的照片。</p>
				<p>http://www.example.com/photo/logo 很容易让你想到 URL 重写。事实上，这个地址很可能会在服务器内部处理为 http://www.example.com/photo.php?name=logo 这样的地址。photo.php 是服务器端的一个动态脚本文件，根据 name 参数生成 xhtml 文档返回给浏览器。</p>
				<p>现在假设我们要获取这张照片的 XML 文档。XML 文档中包含照片的文件名、文件大小、拍摄日期等等信息。也就是说我们要获取<strong>“同一个资源的不同表现形式的数据”</strong>。对于这个要求，我们可以很容易的用另一个 URL 地址达到：http://www.example.com/xml/logo。</p>
				<p>但是，这就违背了<strong>“URI 唯一标识一个资源”</strong>的定义。如果我们要获取同一个资源的多种表现形式，那么就要使用更多的 URL，从而给一个资源指定了多个不同的 URI。</p>
				<p>而在 REST 中，不管是获取照片的 xhtml 文档还是 XML 文档，或者照片文件本身，都是用同一个 URI，就是 http://www.example.com/photo/logo。</p>
				<p>那这是怎么办到的呢？Ruby On Rails 中是通过分辨 HTTP Request Header 信息来分辨客户端是想要取得资源的哪一种表现形式的数据。</p>
				<p>当我们用浏览器访问一个网址时，浏览器会构造一个 HTTP 请求。这个请求有一个头信息，其中包括了本次请求接受何种类型的数据。通常浏览器发送的 HTTP 请求头中，Accept 的值都是 */*，也就说接受服务器返回的任何类型的数据。</p>
				<p>看到这里，聪明的家伙应该知道了。只要我们指定一个特定的 Accept 参数，那么服务器就可以通过判断该参数来决定返回什么类型的数据。所以在一个采用 REST 架构的应用中，要获取同一个资源的不同表现形式的数据，只需要使用不同的 HTTP 请求头信息就行了。</p>
				<p>如果考虑为 Web 应用增加 Web Services，这种技术的价值就体现出来了。比如我写了一个 Delphi 程序，现在只需要构造一个包含 Accept: text/xml 的 HTTP 请求头，然后将请求发送到 http://www.example.com/photo/logo 就可以了。返回的结果就是一个 XML 文档，而不是 xhtml 文档。</p>
				<p>因为我们的 HTTP 请求头信息有不同的状态，从而可以获得不同的数据，所以叫做“具象状态传输” <img class="wp-smiley" alt=":)" src="http://www.dualface.com/blog/wp-includes/images/smilies/icon_smile.gif" /></p>
				<p>—————————————</p>
				<p>除了上面的用法，REST 还有进一步的扩展。</p>
				<p>我们在 Web 应用中处理来自客户端的请求时，通常只考虑 GET 和 POST 这两种 HTTP 请求方法。实际上，HTTP 还有 HEAD、PUT、DELETE 等请求方法。而在 REST 架构中，用不同的 HTTP 请求方法来处理对资源的 CRUD（创建、读取、更新和删除）操作：</p>
				<ul>
						<li>POST: 创建 
</li>
						<li>GET: 读取 
</li>
						<li>PUT: 更新 
</li>
						<li>DELETE: 删除 </li>
				</ul>
				<p>经过这样的一番扩展，我们对一个资源的 CRUD 操作就可以通过同一个 URI 完成了：</p>
				<p>http://www.example.com/photo/logo（读取）<br />仍然保持为 [GET] http://www.example.com/photo/logo</p>
				<p>http://www.example.com/photo/logo/create（创建）<br />改为 [POST] http://www.example.com/photo/logo</p>
				<p>http://www.example.com/photo/logo/update（更新）<br />改为 [PUT] http://www.example.com/photo/logo</p>
				<p>http://www.example.com/photo/logo/delete（删除）<br />改为 [DELETE] http://www.example.com/photo/logo</p>
				<p>从而进一步规范了资源标识的使用。</p>
				<p>通过 REST 架构，Web 应用程序可以用一致的接口（URI）暴露资源给外部世界，并提供对资源的操作服务。这对于以资源为中心的 Web 应用来说非常重要。例如照片共享网站、用户社区等。</p>
				<p>—————————————</p>
				<p>Ruby On Rails 1.2 版对 REST 有很好的支持，但要在 PHP 中应用 REST 还需要解决不少问题：</p>
				<ul>
						<li>如何在服务端判断 PUT、DELETE 请求方法； 
</li>
						<li>如何获取用 PUT、DELETE 请求方法中传递的数据； 
</li>
						<li>如何获取 HTTP 请求头信息中的 Accept 参数值； 
</li>
						<li>如何在浏览器端发起 PUT 和 DELETE 请求。 </li>
				</ul>
				<p>不过我仔细看了 PHP 文档，我觉得上面几个问题都是可以解决的。</p>
				<p>服务端综合使用 $_SERVER[’HTTP_ACCEPT’]、$_SERVER[’REQUEST_URI’]、$_SERVER[’REQUEST_METHOD’]、$_SERVER[’QUERY_STRING’] 这些变量应该可以搞定前面三个问题。而第四个问题则可以用 JavaScript 的 XMLHttpRequest 对象来实现。</p>
				<p>不过我想 REST 的真正价值在于 Web Services，而不是通过浏览器操作的应用程序。</p>
				<p>—————————————</p>
				<p>参考：</p>
				<ul>
						<li>
								<a href="http://www-128.ibm.com/developerworks/cn/webservices/ws-restvsoap/">面向资源与面向活动的 Web 服务</a>
						</li>
						<li>
								<a href="http://www-128.ibm.com/developerworks/cn/java/j-cb08016/">跨越边界: REST on Rails</a>
						</li>
						<li>
								<a href="http://www.ibm.com/developerworks/cn/web/wa-ajaxarch/">Ajax 和 REST，第 1 部分</a>
						</li>
						<li>
								<a href="http://www.xfront.com/REST-Web-Services.html">Building Web Services the REST Way 
<li><a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm">Architectural Styles and the Design of Network-based Software Architectures</a></li><li><a href="http://dev2dev.bea.com.cn/bbsdoc/20060529259.html">SIP/IMS网络中的Representational State Transfer (REST)和数据分布</a></li></a>
						</li>
				</ul>
		</div>
<img src ="http://www.blogjava.net/alex/aggbug/95440.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/alex/" target="_blank">Alex</a> 2007-01-23 08:30 <a href="http://www.blogjava.net/alex/archive/2007/01/23/95440.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>