首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Playframework - JAVA :获取Post数据

Playframework - JAVA :获取Post数据
EN

Stack Overflow用户
提问于 2014-11-05 23:21:05
回答 2查看 10.4K关注 0票数 4

我做错什么了??

我正在尝试任何方法来获取帖子数据,但总是不起作用。所以它是空的,执行第一个条件性响应是badRequest(“删除一些数据”)

路线

代码语言:javascript
复制
POST   /pedidos/novo    controllers.Pedidos.cadastraPedidoNoBanco

在我的控制器中的行动

代码语言:javascript
复制
@BodyParser.Of(BodyParser.Json.class)
    public static Result cadastraPedidoNoBanco(){
        JsonNode data = request().body().asJson();
        if(data == null){
            return badRequest("Expceting some data");
        } else {
            return ok(data);
        }
    }

另一次失败测试

因此,这没有发生任何错误,但我不知道为什么反应是:

来源

代码语言:javascript
复制
public static Result cadastraPedidoNoBanco(){
    Map<String,String[]> data = request().body().asFormUrlEncoded();
    if(data == null){
        return badRequest("Expceting some data");
    } else {
        String response = "";
        for(Map.Entry value : data.entrySet()){
            response += "\n" + value.getValue();
        }
        return ok(response);
    }
}

响应

代码语言:javascript
复制
[Ljava.lang.String;@5817f93f
[Ljava.lang.String;@decc448
[Ljava.lang.String;@334a5a1c
[Ljava.lang.String;@5661fe92
[Ljava.lang.String;@3b904f8c
[Ljava.lang.String;@7f568ee0
[Ljava.lang.String;@bbe5570

卷曲

代码语言:javascript
复制
curl "http://localhost:9000/pedidos/novo" -H "Origin: http://localhost:9000" -H "Accept-Encoding: gzip,deflate" -H "Accept-Language: en-US,en;q=0.8,pt-BR;q=0.6,pt;q=0.4" -H "User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/537.36" -H "Content-Type: application/x-www-form-urlencoded" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" -H "Cache-Control: max-age=0" -H "Referer: http://localhost:9000/pedidos/novo" -H "Connection: keep-alive" -H "DNT: 1" --data "nome_cliente=nj&telefone_cliente=jn&rua_cliente=jkn&num_cliente=kjn&comp_cliente=kjn&cep_cliente=kjn&bairro_cliente=jnk" --compressed
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-06 11:21:01

DynamicForm更舒适(不需要删除@BodyParser注释,您不需要它):

(游戏样本2.3.x)

代码语言:javascript
复制
import play.data.DynamicForm;
import play.data.Form;

public static Result cadastraPedidoNoBanco() {

    DynamicForm form = Form.form().bindFromRequest();

    if (form.data().size() == 0) {
        return badRequest("Expceting some data");
    } else {
        String response = "Client " + form.get("nome_cliente") + "has phone number " + form.get("telefone_cliente");

        return ok(response);
    }
}

更好的是..。

选项将为您的表单创建专用表单,因此您可以使用内置约束、类型等验证字段,示例表单看起来类似于.

app/forms/Pedido.java

代码语言:javascript
复制
package forms;

import play.data.validation.Constraints;

public class Pedido {

    @Constraints.Required()
    @Constraints.MinLength(3)
    public String nome_cliente;

    @Constraints.Required()
    @Constraints.MinLength(9)
    public String telefone_cliente;

    @Constraints.Required()
    public Long some_number;
    //etc...
}

你的行动:

代码语言:javascript
复制
import java.util.List;
import java.util.Map;

import play.data.Form;
import forms.Pedido;
import play.data.validation.ValidationError;
import play.i18n.Messages;

public class Pedidos extends Controller {


    public static Result cadastraPedidoNoBanco() {
        Form<Pedido> form = Form.form(Pedido.class).bindFromRequest();

        if (form.hasErrors()) {
            String errorsMsg = "There are " + form.errors().size() + " errors... \n";

            // Of course you can skip listing the errors
            for (Map.Entry<String, List<ValidationError>> entry : form.errors().entrySet()) {
                String errorKey = entry.getKey();
                List<ValidationError> errorsList = entry.getValue();
                for (ValidationError validationError : errorsList) {
                    errorsMsg += errorKey + " / " + Messages.get(validationError.message()) + "\n";
                }
            }

            return badRequest(errorsMsg);
        }

        Pedido data = form.get();
        String response = "Client " + data.nome_cliente + " has phone number " + data.telefone_cliente;

        return ok(response);
    }

}

另一方面,如果您的数据来自网站表单,通常您想要的是再次呈现表单.

代码语言:javascript
复制
if (form.hasErrors()) {
    return badRequest(views.html.yourViewWithForm.render(form));
}
票数 10
EN

Stack Overflow用户

发布于 2014-11-05 23:55:07

我可以得到职位价值。我发现为什么“另一个测试失败”不起作用。因为Playframework总是将数组返回给我。如果我只使用唯一的param,我只需要使用第一个值。

示例如果我有post param "name“

我要去做

代码语言:javascript
复制
request().body().asFormUrlEncoded().get("name")[0];
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26769037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档