【问题标题】:Post JSON-Data from PlayFramework form从 PlayFramework 表单发布 JSON 数据
【发布时间】:2015-04-10 15:40:29
【问题描述】:

Play 框架提供了一种通过request().body().asJson() 访问请求正文中的 JSON 数据的方法。使用表单助手不会以 JSON 格式发布数据。

那么,在播放应用程序中,将表单数据传递给控制器​​之前将其转换为 json 对象的最佳方式是什么?

提前致谢。

【问题讨论】:

  • 控制器中真的需要json吗?或者 POJO 可以吗?
  • 是的,但这仅适用于控制器代码。我需要的是一种将 JSON 从客户端发送到控制器的方法
  • 但是为什么你想要JSON?
  • 因为我喜欢将请求直接发送到支持 JSON 的 REST API

标签: java javascript json playframework playframework-2.3


【解决方案1】:

当您检索请求有效负载数据时,您可以使用BodyParsers(他们使用Content-Type 标头将有效负载解析为其他内容)或者您可以通过表单绑定自己获取有效负载或直接作为JSON 如果您在请求正文中有 JSON/文本负载。

在您的情况下,您的 Content-Typeapplication/x-www-form-urlencoded OR multipart/form-data。因此,您需要使用辅助类绑定到该表单以获取该数据,如果您真的想将其转换为 JSON,您只需添加一个将其插入 ObjectNode 的额外步骤。

如果您希望表单数据为 JSON,请直接在前端进行转换,如果可能,并将其发送到正文中作为 Content-Type application/json

现在,你明白为什么你想做的只是增加额外的复杂性而没有明显的收益吗?

【讨论】:

  • 我真的很喜欢没有解释的反对票……聪明的人,把它们带上!
  • 我知道这一点。事实上,这是我的问题。
  • 我在给你争论为什么这不是一个好主意。就是这样。
  • 另外,如果您阅读第三段,您将看到“在将表单数据传递给控制器?”。好吧,部分原因是它不在游戏应用程序中......
  • 我不是在寻求反对这种方法的论据,而是寻求解决方案。
【解决方案2】:

1.将表单序列化为 JSON-Object

$.fn.serializeObject = function(){
var o = {};
var a = this.serializeArray();
$.each(a, function() {
    if (o[this.name] !== undefined) {
        if (!o[this.name].push) {
            o[this.name] = [o[this.name]];
        }
        o[this.name].push(this.value || '');
    } else {
        o[this.name] = this.value || '';
    }
});
return o;
};

2.定义内容类型为application/json的AJAX请求

$.ajaxSetup({
    contentType: "application/json; charset=utf-8" 
});

function request(path, params, method) {
method = method || "POST";

$.ajax({
    url: path,
    type: method,
    data: params,
    dataType: "json",
    contentType: "application/json; charset=utf-8",
    success: function (result) {
        //do something
    },
    error: function (xhr, ajaxOptions, thrownError) {
        //do something
    }
});
}

3.表单提交后发送数据

$(function() {
var url = "/api/route";

$('form').submit(function() {
    var json = JSON.stringify($('form').serializeObject());
    request(url, json);
    return false;
});
});

【讨论】:

  • 看,这并不难(虽然序列化得到 JSON ......)。您通过重新提供给定的解决方案而作弊,但只要您做到了,谁会在乎。
  • 我希望得到这样的答案。现在我希望它可能对其他人有所帮助:) 感谢您抽出宝贵的时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多