我正在尝试使用JavaScript路由发出POST请求。在路线文件中:
POST /comments controllers.Clients.addComment(text: String, client: Int)
GET /assets/javascripts/routes controllers.Application.javascriptRoutes()
页面上的:
jsRoutes.controllers.Clients.addComment(args.text, @client.id).ajax(...);
但它会创建请求
POST http://localhost:9000/comments?text=qwe&client=1 HTTP/1.1
如何让它在POST正文中传递参数而不是请求字符串?
答案 0 :(得分:9)
看看ajax() documentation - 就是这样的例子:
$.ajax({
type: "POST",
url: "some.php",
data: { name: "John", location: "Boston" }
});
由于Play JavaScript路由已经定义了url
和请求方法(type
),您只需添加data
(当然您不需要指定它们)作为括号中的参数)
jsRoutes.controllers.Clients.addComment().ajax(
data: {
client: @client.id,
text: args.text
}
);
此外,您只能向给定的客户发送文字(由网址确定(可以是POST
,但PUT
看起来更好:)):
PUT /comments/:client controllers.Clients.addComment(client: Int)
在视图中:
jsRoutes.controllers.Clients.addComment(@client.id).ajax(
data: { text: args.text }
);
因此,它会向http://domain.tld/comments/123
执行PUT请求,并且text
中的form()
将在POST时发送:
public static Result addComment(int client) {
String receivedText = form().bindFromRequest().get("text");
// save it to DB ...
return ok( "Added comment: "+ receivedText+ ". for client id: " + client);
}
答案 1 :(得分:0)
由于我不太了解Play中的JsRoutes,我所做的是:
在我看来:
var client = 1;
$.ajax({
type: "POST",
url: "/comments/" + client,
});
在我的路线中,调用方法:
GET /comments/:client controllers.Clients.addComment(client: Int)
这样可以让浏览器像对正常的ajax调用一样对路由中定义的某些URL进行请求。