我有一个带有POST路由的Play应用程序,它将充当RESTful API。
在控制器中获取POST数据的最佳方法是什么?正如您从我的控制器中看到的那样,我尝试了这一点,但它似乎无法正常工作。
路线:
# Routes
# This file defines all application routes (Higher priority routes first)
# ~~~~
# Home page
GET / controllers.Application.index()
GET /api/getMessages controllers.Application.getMessages()
POST /api/createMessage controllers.Application.createMessages()
控制器:
package controllers;
import play.*;
import play.mvc.*;
import static play.libs.Json.toJson;
import java.util.Map;
import models.*;
import views.html.*;
public class Application extends Controller {
public static Result index() {
return ok(index.render("Your new application is ready."));
}
public static Result createMessages(){
final Map<String, String[]> values = request().body().asFormUrlEncoded();
String from = values.get("from")[0];
String subject = values.get("subject")[0];
String message = values.get("message")[0];
Message.create(from, subject, message);
return ok(toJson("ok"));
}
public static Result getMessages(){
return ok(toJson(Message.all()));
}
}
请求:
Request Url: http://localhost:9000/api/createMessage
Request Method: POST
Status Code: 400
Params: {
"from": "hello@test.com",
"subject": "Hello",
"message": "World"
}
答案 0 :(得分:2)
尝试使用DynamicForm:
public static Result createMessages(){
DynamicForm df = play.data.Form.form().bindFromRequest();
String from = df.get("from");
String subject = df.get("subject");
String message = df.get("message");
if(from != null && subject != null && message != null){
Message.create(from, subject, message);
return ok(toJson("ok"));
} else {
return ok(toJson("error"));
}
}
答案 1 :(得分:1)
我很确定作者已经找到了2年的解决方案:),但今天我遇到了同样的麻烦,可能我的细微差别会帮助某人:
我使用相同的方法来获取POST参数:
request().body().asFormUrlEncoded().get("from")[0];
我也得到了错误。但错误是因为不同的POST类型。所以在我的情况下,我只需要在下一个版本中期待多部分表格数据:
request().body().asMultipartFormData().asFormUrlEncoded().get("from")[0];
所以 - 对你要发送的数据和你期望的数据要小心一点:)