我正在按照本教程运行从dart到我的Ruby on rails后端应用程序的POST方法。因此,在第一次尝试本教程中显示的代码时,只需更改我的 URL 和 JSON 数据即可。
void main() {
String jsonData = '{"color":"blue","x":"100","y":"100"}';
saveData(jsonData, onSuccess); // send the data to // the server
}
void onSuccess(HttpRequest req) {
print(req.responseText); // print the received raw JSON text
}
void saveData(String data, onSuccess(HttpRequest req)) {
HttpRequest req = new HttpRequest(); // create a new XHR
// add an event handler that is called when the request finishes
req.on.readyStateChange.add((Event e) {
if (req.readyState == HttpRequest.DONE &&
(req.status == 200 || req.status == 0)) {
onSuccess(req); // called when the POST successfully completes
}
});
var url = "http://localhost:3030/colored_rectangles.json";
req.open("POST", url); // Use POST http method to send data in the next call
req.send(data); // kick off the request to the server
}
这是我的控制器中的方法和 ruby 中的模型(非常简单,用脚手架生成):
# POST /colored_rectangles
# POST /colored_rectangles.json
def create
@colored_rectangle = ColoredRectangle.new(params[:colored_rectangle])
respond_to do |format|
if @colored_rectangle.save
format.html { redirect_to @colored_rectangle, notice: 'Colored rectangle was successfully created.' }
format.json { render json: @colored_rectangle, status: :created, location: @colored_rectangle }
else
format.html { render action: "new" }
format.json { render json: @colored_rectangle.errors, status: :unprocessable_entity }
end
end
end
class ColoredRectangle < ActiveRecord::Base
attr_accessible :color, :x, :y
end
当我运行代码时,我在 Dart 中收到以下错误:
Failed to load resource: the server responded with a status of 500 (Internal Server Error)
http://localhost:3030/colored_rectangles.json
和 Rails 中的登录:
REXML::ParseException (The document "{"color":"blue","x":"100","y":"100"}" does not have a valid root):
activesupport (3.2.9) lib/active_support/xml_mini/rexml.rb:35:in `parse'
C:in `parse'
etc....
阅读此问题后,我尝试将标头更改为"内容类型:应用程序/json",然后我尝试调用过度的MimeType方法,但它给了我相同的错误。
req.overrideMimeType("application/json");
我还调用了setRequestHeader方法,代码如下:
void saveLanguageData(String data, onSuccess(HttpRequest req)) {
HttpRequest req = new HttpRequest(); // create a new XHR
// add an event handler that is called when the request finishes
req.on.readyStateChange.add((Event e) {
if (req.readyState == HttpRequest.DONE &&
(req.status == 200 || req.status == 0)) {
onSuccess(req); // called when the POST successfully completes
}
});
var url = "http://localhost:3030/colored_rectangles.json";
req.setRequestHeader("Content-type", "application/json"); //This was added
req.open("POST", url); // Use POST http method to send data in the next call
req.send(data); // kick off the request to the server
}
但是我从Dart收到以下错误:
Exception: Error: INVALID_STATE_ERR: DOM Exception 11
Stack Trace: #0 HttpRequest.setRequestHeader (E:bbuildslavedartium-win-full-trunkbuildsrcbuildReleaseobjglobal_intermediatewebkitbindingsdartdarthtmlHttpRequest.dart:34:1)
#1 saveLanguageData (http://localhost:3030/rademo_dart/web/rademo.dart:45:23)
#2 main (http://localhost:3030/rademo_dart/web/rademo.dart:10:19)
任何帮助,不胜感激。提前谢谢。
哦,好吧,我找到了问题的答案...实际上 setRequestHeader 需要在 req.open 之后调用,因此 saveData 方法代码如下:
void saveData(String data, onSuccess(HttpRequest req)) {
HttpRequest req = new HttpRequest(); // create a new XHR
// add an event handler that is called when the request finishes
req.on.readyStateChange.add((Event e) {
if (req.readyState == HttpRequest.DONE &&
(req.status == 200 || req.status == 0)) {
onSuccess(req); // called when the POST successfully completes
}
});
var url = "http://localhost:3030/colored_rectangles.json";
req.open("POST", url); // Use POST http method to send data in the next call
req.setRequestHeader("Content-type", "application/json");
req.send(data); // kick off the request to the server
}
在@colored_rectangle = ColoredRectangle.new(params[:colored_rectangle])
上,在 create
方法中,您将数据发送到 ColoredRectangle 的构造函数,但您使用的是根:colored_rectangle
。此根不存在于您发送的 json 中。要修复它,只需将根添加到 json,如下所示:String jsonData = '{"colored_rectangle": {"color":"blue","x":"100","y":"100"}}';