- 浏览: 2674929 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
80后的童年2:
深入浅出MongoDB应用实战开发网盘地址:https://p ...
MongoDB入门教程 -
shliujing:
楼主在不是精通java和php的前提下,请不要妄下结论。
PHP、CakePHP哪凉快哪呆着去 -
安静听歌:
希望可以一给一点点注释
MySQL存储过程之代码块、条件控制、迭代 -
qq287767957:
PHP是全宇宙最强的语言!
PHP、CakePHP哪凉快哪呆着去 -
rryymmoK:
深入浅出MongoDB应用实战开发百度网盘下载:链接:http ...
MongoDB入门教程
从Rails的svn资源库下载最新的Rails,我们会发现多了个activeresource包
从此Rails核心模块变为: ActiveRecord、ActionPack、ActionWebService、AcionMailer、ActiveResource、ActiveSupport和Railties
这里有几个问题:
一,ActionController里的resources.rb文件与ActiveResource是什么关系?
当初我看到Edge Rails里多了activeresource这个包时,我第一反应就是ActionController::Resources被ActiveResource替代了吧?
但是我去ActionPack里一看,resources.rb文件依然存在,原来我的判断错了: ActionController::Resources != ActiveResource
ActionController::Resources的工作就是创建了map.resource(s)这个DSL
这个DSL的底层含义是为一组或单个resource(其实是一组或单个对象)做两样事情:
a,生成一组named routes命名
b,为一组http动词(:get/:post/:put/:delete)做一个到一组action(index/new/create/show/edit/update/destroy)的映射
ActionController::Resources是REST风格的Rails实现,它的目的就是让我们做RESTful风格的Rails开发
按ActionController::Resources的指导,我们依照HTTP method规范开发系统,可以对html和xml两种response格式render内容
但我们慢慢发现,ActionController::Resources只为我们提供了REST web service的发布功能,而没有提供消费功能!
ActiveResource的工作看看官方说法则不言而喻了:
Active Resource (ARes) connects business objects and Representational State Transfer (REST)
web services. It implements object-relational mapping for REST webservices to provide transparent
proxying capabilities between a client (ActiveResource) and a RESTful service (which is provided by Simply RESTful
routing in ActionController::Resources).
ActiveResource不是ActionController::Resources的替代者,而是REST web service的消费者
Active Resource是一个proxy的角色,它连接model与service,加上一点胶水,让REST web service的调用简化无比
Active Resource的架构类似于ActiveRecord,等会我们看看代码来加深认识
二,Rails有ActionWebService,还要ActiveResource干什么?
这个问题是刚才在JavaEye上看到的,其实应该说ActionWebService和ActionController::Resources+ActiveResource才有可比性
最大的区别就是ActionWebService是基于SOAP的,而ActionController::Resources和ActiveResource则是基于轻量的REST、XML的
ActionWebService是Rails对SOAP web service的封装,并提供Client端调用API
不过ActionWebService也支持XML-RPC协议
三,ActiveResource尝鲜
看代码吧!
Person类继承ActiveResource::Base,然后调用site=这个类方法,参数为一个URL
就这么简单,现在Person已经映射到如下RESTful resources位置: http://api.people.com:3000/people/
==== Create:
==== Find:
==== Update:
==== Delete:
ActiveResource基于HTTP协议并充分使用HTTP规范里的动词:
* GET requests are used for finding and retrieving resources.
* POST requests are used to create new resources.
* PUT requests are used to update existing resources.
* DELETE requests are used to delete resources.
而Person类就是对http://api.people.com:3000/people/链接上的REST web service的代理,我们可以像使用ActiveRecord对象一样使用ActiveResource对象
四、ActiveResource源码分析一二
active_resource/base.rb:
我们看到find、create、destroy都是使用connection来做具体的操作,让我们再看connection.rb:
核心代码就是这些,最后只是调用Net::HTTP对象的get/post/put/delete方法,socket连接而已
主要是我们的REST web service host(如http://api.people.com:3000/)已经成功发布web服务,我们访问相应的url即可(如people.xml、people/1.xml)
ActiveResource以我们熟悉的ActiveRecord操作方式来封装和架构我们的REST web service客户端API以简化开发,我们只能说两个字:佩服!
五、ActionController::Resources的一些改动
Changeset 6485
源码:
“/messages/1;edit”这种url已经替换成“/messages/1/edit”,早该这样了不是吗?
Ticket #8251
源码例子和上面一样,name_prefix放到path的最前面去了,action名字挪到它后面
从此Rails核心模块变为: ActiveRecord、ActionPack、ActionWebService、AcionMailer、ActiveResource、ActiveSupport和Railties
这里有几个问题:
一,ActionController里的resources.rb文件与ActiveResource是什么关系?
当初我看到Edge Rails里多了activeresource这个包时,我第一反应就是ActionController::Resources被ActiveResource替代了吧?
但是我去ActionPack里一看,resources.rb文件依然存在,原来我的判断错了: ActionController::Resources != ActiveResource
ActionController::Resources的工作就是创建了map.resource(s)这个DSL
这个DSL的底层含义是为一组或单个resource(其实是一组或单个对象)做两样事情:
a,生成一组named routes命名
b,为一组http动词(:get/:post/:put/:delete)做一个到一组action(index/new/create/show/edit/update/destroy)的映射
ActionController::Resources是REST风格的Rails实现,它的目的就是让我们做RESTful风格的Rails开发
按ActionController::Resources的指导,我们依照HTTP method规范开发系统,可以对html和xml两种response格式render内容
但我们慢慢发现,ActionController::Resources只为我们提供了REST web service的发布功能,而没有提供消费功能!
ActiveResource的工作看看官方说法则不言而喻了:
引用
Active Resource (ARes) connects business objects and Representational State Transfer (REST)
web services. It implements object-relational mapping for REST webservices to provide transparent
proxying capabilities between a client (ActiveResource) and a RESTful service (which is provided by Simply RESTful
routing in ActionController::Resources).
ActiveResource不是ActionController::Resources的替代者,而是REST web service的消费者
Active Resource是一个proxy的角色,它连接model与service,加上一点胶水,让REST web service的调用简化无比
Active Resource的架构类似于ActiveRecord,等会我们看看代码来加深认识
二,Rails有ActionWebService,还要ActiveResource干什么?
这个问题是刚才在JavaEye上看到的,其实应该说ActionWebService和ActionController::Resources+ActiveResource才有可比性
最大的区别就是ActionWebService是基于SOAP的,而ActionController::Resources和ActiveResource则是基于轻量的REST、XML的
ActionWebService是Rails对SOAP web service的封装,并提供Client端调用API
不过ActionWebService也支持XML-RPC协议
三,ActiveResource尝鲜
看代码吧!
class Person < ActiveResource::Base self.site = "http://api.people.com:3000/" end
Person类继承ActiveResource::Base,然后调用site=这个类方法,参数为一个URL
就这么简单,现在Person已经映射到如下RESTful resources位置: http://api.people.com:3000/people/
==== Create:
p = Person.create(:name => 'Robbin') # POST http://api.people.com:3000/people.xml # Submit: # <person><name>Robbin</name></person>
==== Find:
p = Person.find(1) # GET http://api.people.com:3000/people/1.xml # Response: # <person><id>1</id><name>Robbin</name></person> people = Person.find(:all) # GET http://api.people.com:3000/people.xml # Response: # <people> # <person><id>1</id><first>Robbin</first></person> # <person><id>2</id><first>Gigix</first></person> # </people>
==== Update:
p = Person.find(1) p.name = 'Hideto' p.save # PUT http://api.people.com:3000/people/1.xml # Submit: # <person><name>Hideto</name></person>
==== Delete:
p = Person.find(2) p.destroy # DELETE http://api.people.com:3000/people/2.xml
ActiveResource基于HTTP协议并充分使用HTTP规范里的动词:
* GET requests are used for finding and retrieving resources.
* POST requests are used to create new resources.
* PUT requests are used to update existing resources.
* DELETE requests are used to delete resources.
而Person类就是对http://api.people.com:3000/people/链接上的REST web service的代理,我们可以像使用ActiveRecord对象一样使用ActiveResource对象
四、ActiveResource源码分析一二
active_resource/base.rb:
module ActiveResource class Base class << self def site if defined?(@site) @site elsif superclass != Object and superclass.site superclass.site.dup.freeze end end def site=(site) @connection = nil @site = site.nil? ? nil : create_site_uri_from(site) end def create(attributes = {}) returning(self.new(attributes)) { |res| res.save } end def find(*arguments) scope = arguments.slice!(0) options = arguments.slice!(0) || {} case scope when :all then find_every(options) when :first then find_every(options).first when :one then find_one(options) else find_single(scope, options) end end private def find_every(options) case from = options[:from] when Symbol instantiate_collection(get(from, options[:params])) when String path = "#{from}#{query_string(options[:params])}" instantiate_collection(connection.get(path, headers) || []) else prefix_options, query_options = split_options(options[:params]) path = collection_path(prefix_options, query_options) instantiate_collection( (connection.get(path, headers) || []), prefix_options ) end end def create_site_uri_from(site) site.is_a?(URI) ? site.dup : URI.parse(site) end end attr_accessor :attributes def destroy connection.delete(element_path, self.class.headers) end end end
我们看到find、create、destroy都是使用connection来做具体的操作,让我们再看connection.rb:
module ActiveResource class Connection def get(path, headers = {}) xml_from_response(request(:get, path, build_request_headers(headers))) end def delete(path, headers = {}) request(:delete, path, build_request_headers(headers)) end def put(path, body = '', headers = {}) request(:put, path, body.to_s, build_request_headers(headers)) end def post(path, body = '', headers = {}) request(:post, path, body.to_s, build_request_headers(headers)) end private def http unless @http @http = Net::HTTP.new(@site.host, @site.port) @http.use_ssl = @site.is_a?(URI::HTTPS) @http.verify_mode = OpenSSL::SSL::VERIFY_NONE if @http.use_ssl end @http end def request(method, path, *arguments) logger.info "#{method.to_s.upcase} #{site.scheme}://#{site.host}:#{site.port}#{path}" if logger result = nil time = Benchmark.realtime { result = http.send(method, path, *arguments) } logger.info "--> #{result.code} #{result.message} (#{result.body.length}b %.2fs)" % time if logger handle_response(result) end def handle_response(response) case response.code.to_i when 200...400 response when 404 raise(ResourceNotFound.new(response)) when 405 raise(MethodNotAllowed.new(response)) when 409 raise(ResourceConflict.new(response)) when 422 raise(ResourceInvalid.new(response)) when 401...500 raise(ClientError.new(response)) when 500...600 raise(ServerError.new(response)) else raise(ConnectionError.new(response, "Unknown response code: #{response.code}")) end end end end
核心代码就是这些,最后只是调用Net::HTTP对象的get/post/put/delete方法,socket连接而已
主要是我们的REST web service host(如http://api.people.com:3000/)已经成功发布web服务,我们访问相应的url即可(如people.xml、people/1.xml)
ActiveResource以我们熟悉的ActiveRecord操作方式来封装和架构我们的REST web service客户端API以简化开发,我们只能说两个字:佩服!
五、ActionController::Resources的一些改动
Changeset 6485
源码:
def map_collection_actions(map, resource) resource.collection_methods.each do |method, actions| actions.each do |action| action_options = action_options_for(action, resource, method) map.deprecated_named_route("#{action}_#{resource.name_prefix}#{resource.plural}", "#{resource.name_prefix}#{action}_#{resource.plural}", "#{resource.path}/#{action}", action_options) map.deprecated_named_route("formatted_#{action}_#{resource.name_prefix}#{resource.plural}", "formatted_#{resource.name_prefix}#{action}_#{resource.plural}", "#{resource.path}/#{action}.:format", action_options) end end end
“/messages/1;edit”这种url已经替换成“/messages/1/edit”,早该这样了不是吗?
Ticket #8251
源码例子和上面一样,name_prefix放到path的最前面去了,action名字挪到它后面
发表评论
-
用了TextMate才知道什么叫神级Editor
2011-03-09 04:51 57943一直用Eclipse作为开发Ruby和Java项目的IDE,但 ... -
Ruby使用OAuth登录新浪微博和豆瓣
2011-01-09 12:49 4411首先需要安装oauth这个gem包 gem install ... -
使用Passenger+nginx部署Rails
2010-12-28 15:12 50011. Install Passender gem instal ... -
markItUp+rdiscount搭建Rails下可视化Markdown编辑器
2010-12-21 17:48 5438markItUp是基于jQuery的可视化编辑器,支持Html ... -
Rails3 and MongoDB Quick Guide
2010-12-10 14:13 2751Install MongoDB Download: http: ... -
基于ruby-protobuf的rpc示例
2009-08-11 11:51 41421, 安装ruby-protobuf gem instal ... -
Ruby导出xls和csv的utf-8问题的解决
2009-02-04 15:05 6825数据库数据为utf-8格式,包括中文和拉丁文等等 导出文件xl ... -
URL/HTML/JavaScript的encode/escape
2009-01-04 13:03 9311最近经常被URL、HTML、JavaScript的encode ... -
各种排序的Ruby实现
2008-11-27 14:51 3993Θ(n^2) 1, Bubble sort def bu ... -
12月5日北京RoR活动!
2008-11-26 18:38 3013又是一年过去了,Rails在国内的发展势态良好,很多使用RoR ... -
Rails程序开发的最大问题是代码规范
2008-08-28 11:56 5478使用Rails开发大型复杂B2B应用一年了,这个项目目前开发人 ... -
Web开发大全:ROR版——推荐序
2008-07-09 00:39 2414来自http://www.beyondrails.com/bl ... -
深入ActionMailer,使用Sendmail发邮件
2008-07-03 11:41 3395来自: http://www.beyondrails.com/ ... -
Rails里如何结合ExceptionNotification配置gmail账户发邮件
2008-06-19 19:56 30741,安装ExceptionNotification rub ... -
使用coderay和railscasts样式进行代码高亮
2008-06-17 00:16 2391CodeRay是一个语法高亮的Ruby库,效率很不错。 Cod ... -
Capistrano试用
2008-06-16 19:05 19531,客户端机器安装Capistrano gem insta ... -
lighttpd真垃圾啊
2008-06-04 18:38 2518使用lighttpd+fcgi跑Rails程序,文件上传会si ... -
将gem变成plugin
2008-06-04 11:27 1799有什么样的需求就有什么样的对策 当vhost上的帐号没有ge ... -
在Rails里使用ReCaptcha添加验证码
2008-06-03 15:51 42601,去http://recaptcha.net/sign up ... -
Rails里给文件上传添加progress_bar
2008-05-27 17:00 2083文件上传很慢时,UI没有什么用户提示,这样让人很费解,所以我们 ...
相关推荐
RESOURCES += qrc/painter.qrc 十一、子文件夹编译 子文件夹编译用于编译子文件夹中的源文件。例如: TEMPLATE = subdirs SUBDIRS = src1 \src2 十二、注释 注释用于在 pro 文件中添加注释。例如: # 这是一个...
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("让屏幕开满玫瑰把妹必备.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } ...
特别提示:数据库sql脚本文件在resources / db目录下! 本项目为ssm系列的第一篇, Spring + SpringMVC + mybatis + easyUI的一个简单演示,实现了后台管理系统的基本功能,后续会逐步优化改造,Wiki文档已经整理,...
webResources ++ = Map ( " css/bootstrap.min.css " - > " http://netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css " , " css/bootstrap-theme.min.css " - > " http://netdna.bootstr
百度地图开发java源码 Vue SSM搭建一个简单的Demo前后端分离含增删改查(CRUD)、...ssm_project/src/main/resources/applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://ww
Application.Current.Resources = _defaultTheme; } private void OnMouseEnter(object sender, MouseEventArgs args) { resourceLoaded = true; } void ChangeUser (object sender, ...
RESOURCES += resources/main.qrc # 定义目标文件名 TARGET = myapp # 设置模板类型 TEMPLATE = app # 设置编译模式 CONFIG += release # 设置编译器输出目录 DESTDIR = ./bin # 设置头文件搜索路径 INCLUDE...
我的人生游戏 动机 我一直想用Om和ClojureScript 做点什么,这就是它。 很有可能它不是惯用的 Clojure 代码,您已被警告。 :winking_face: ... 然后你可以在你选择的浏览器中从resources/index.html打开文件。
$ export FILES=src/test/resources/mock_energy_monitor_data.json.gz $ sbt > test [info] DemoSpec: [info] + ============================== JAVA 8 ============================== [info] Finding inputs ...
This book is a collection of in-depth guides to some some of the tools and resources most used with React, such as Jest and React Router, as well as a discussion about how React works well with D3, ...
idea创建Maven项目时,报错显示Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.0.2:resources,并且Maven插件内看不到 mybatis-generator。如下图: 折腾了好久发现配置放错地方了,...
2. `src/main/resources`:存放配置文件,如Spring的XML配置、MyBatis的Mapper XML文件和数据库连接配置。 3. `src/main/webapp`:Web应用目录,包含静态资源(如HTML、CSS、JavaScript)和Spring MVC的视图解析路径...
这是什么? 与 Spring Boot (Jersey2 + Undertow) 集成的 Camunda(休息 + 驾驶舱/任务列表)的演示嵌入式应用程序。 如何? Spring Boot + Jersey 2 + Undertow: 正确配置gradle(包括boot,...Camunda Rest + Coc
需要启动mysql数据库,在oauth-server/src/main/resources/persistence.properties设置数据库访问用户名/密码 依次启动: 授权服务器oauth-server(8081) 资源服务器oauth-resource(8082) AngularJS单页应用oauth-ui-...
3. `src/main/resources`:资源文件夹,包括配置文件(如application.properties或application.yml)、数据库脚本等。 4. `src/main/webapp`:如果是传统Web应用,这里会存放HTML、CSS、JavaScript等前端资源,但...
window下安装Python scipy包报错 no lapack/blas resources found scipy
Features: =========...-XM player, custom fonts, custom cursor, custom shit,... -Simple encryption of patch-data-resources -Hyperlink function (of target URL.. extra long URLs are possible)
Qt5实现定时关机,设定关机时间,设定关机倒计时; QT += core gui QT += widgets greaterThan(QT_MAJOR_VERSION, 4): QT += widgets RC_ICONS +=shutdown.ico TARGET = ShutDown ...RESOURCES += \ qrc.qrc
在这个项目中,开发者可能已经创建了相应的实体类、Mapper接口、XML映射文件,以及Service和Controller层的代码。例如,一个简单的用户管理模块可能会包含User实体,UserMapper接口,对应的UserMapper.xml,...