嗨,我们正在尝试使用xml将数据发布到另一个rails应用程序。
在目的地应用程序上,我有这个代码
class DaemonsController < ApplicationController
skip_before_filter :verify_authenticity_token
respond_to :xml, :html
def new
respond_with(@daemon = Daemon.new)
end
def create
@daemon = Daemon.new(params[:daemon])
if @daemon.save
#redirect_to @daemon, :notice => "Successfully created daemon."
respond_with(@daemon, :location => daemons_url)
else
render :action => 'new'
end
end
end
因此,XML被允许用于发布数据。在我的另一个应用程序中,我使用jquery进行数据发布
$.ajax({
type: "POST",
url: "http://localhost:3000/daemons.xml",
data: "<daemon><mac>abc</mac><status>1</status></daemon>",
contentType: 'application/xml; charset=utf-8', // format of request payload
dataType: 'html', // format of the response
success: function(msg) {
alert( "Data Saved: " + msg );
}
});
但这会返回一个错误:
Started OPTIONS "/daemons.xml" for 127.0.0.1 at 2011-05-30 12:04:05 +0200
ActionController::RoutingError (No route matches "/daemons.xml"):
当我使用curl命令发布相同的数据时,一切正常
curl -i -X 'POST' -H 'Content-Type: application/xml' http://localhost:3000/daemons -d '<daemon><mac>ABC</mac><status>1</status></daemon>'
HTTP/1.1 201 Created
Location: http://localhost:3000/daemons
Content-Type: application/xml; charset=utf-8
Cache-Control: no-cache
X-Ua-Compatible: IE=Edge
X-Runtime: 0.195632
Server: WEBrick/1.3.1 (Ruby/1.9.2/2011-02-18)
Date: Mon, 30 May 2011 10:02:40 GMT
Content-Length: 291
Connection: Keep-Alive
<?xml version="1.0" encoding="UTF-8"?>
<daemon>
<created-at type="datetime">2011-05-30T10:02:39Z</created-at>
<id type="integer">2</id>
<mac-address nil="true"></mac-address>
<status type="integer">1</status>
<updated-at type="datetime">2011-05-30T10:02:39Z</updated-at>
这在webbrick日志中显示
Started POST "/daemons" for 127.0.0.1 at 2011-05-30 12:02:39 +0200
Processing by DaemonsController#create as
Parameters: {"daemon"=>{"mac"=>"ABC", "status"=>"1"}}
AREL (1.6ms) INSERT INTO "daemons" ("mac", "status", "created_at", "updated_at") VALUES (ABC, 1, '2011-05-30 10:02:39.920672', '2011-05-30 10:02:39.920672')
有人知道可能出了什么问题吗?
感谢
cURL命令正在使用http://localhost:3000/daemons,而您的jQuery正在使用http://localhost:3000/daemons.xml?
在进行跨站点ajax请求时,jquery 1.4.x和rails.js的旧版本出现了这个问题。我升级到了jquery 1.6和最新的rails.js,这似乎修复了它。FWIW,这与在ajax请求头中设置CSRF令牌有关。在主叫侧禁用CSRF保护也同样有效。