从 Play Framework 控制器返回 JSON 字符串

Posted

技术标签:

【中文标题】从 Play Framework 控制器返回 JSON 字符串【英文标题】:Return JSON string from Play Framework controller 【发布时间】:2015-04-06 00:06:24 【问题描述】:

我正在从客户端发出 ajax POST 请求。我的 Play Framework 控制器向返回 JSON 的跨域服务器发出请求。然后我想将此 JSON 转发给客户端。当我打电话给Promise<JsonNode>.toString() 时,我似乎收到了一个内存地址。如何将实际的 JSON 返回给客户端?

    public static Result addVenue() 

      final Map<String, String[]> values = request().body().asFormUrlEncoded();
      String queryString = values.get("venueName")[0]  + ",+" + values.get("venueAddress")[0] + ",+" + values.get("venueCity")[0] + ",+" + values.get("venueState")[0] + "+" + values.get("venueZip")[0];
      String queryURL = "https://maps.googleapis.com/maps/api/place/textsearch/json?query=" + queryString + "&key=" + "AIzaSyD1xSgKUnEZ_tM7qzcEAeM-SJBxPFhIpaU";
      queryURL = queryURL.replaceAll(" ", "+");

      Promise<JsonNode> jsonPromise = WS.url(queryURL).get().map(
              new Function<WSResponse, JsonNode>() 
                  public JsonNode apply(WSResponse response) 
                      JsonNode json = response.asJson();
                      return json;
                  
              
      );

      response().setHeader("Access-Control-Allow-Origin", "*");
      response().setHeader("Allow", "*");
      response().setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
      response().setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Referer, User-Agent");
      return ok(jsonPromise.toString());

【问题讨论】:

您阅读文档了吗?答案就在那里。 playframework.com/documentation/2.3.x/JavaAsync @Ryan 是的,我做到了,但是,文档提到将请求的主体作为儿子返回,而不是从外部 Web 服务获得新的响应。 只是好奇,为什么这是-1? 我没有投反对票,但这可能是因为答案在文档中。 playframework.com/documentation/2.3.x/JavaWS 【参考方案1】:

返回一个结果的承诺:

public static Promise<Result> addVenue() 
    return WS.url(URL).get().map((response) -> 
        return ok(response.asJson());
    );

【讨论】:

谢谢。我昨晚终于弄明白了。我的代码有点不同。我会在下面发布。【参考方案2】:

我终于能够使用以下代码返回 JSON。我的实现与提供的另一个答案略有不同。我会提供它,以防万一另一个对某些人不起作用。

 final Promise<Result> resultPromise = WS.url(queryURL).get().map(
            new Function<WSResponse, Result>() 
                public Result apply(WSResponse response) 
                    Logger.info(response.asJson().toString());
                    return ok(response.asJson().toString());
                
            
 );
 return resultPromise;

【讨论】:

这和上面一样,但是对于Java 7 :) 注意你不需要使用“.toString()”在响应中发送Json

以上是关于从 Play Framework 控制器返回 JSON 字符串的主要内容,如果未能解决你的问题,请参考以下文章

Play Framework bindFromRequest() 方法返回参数为空的对象

现有 Play Framework webapp 的 SPA 行为

Play framework 1.x 重定向删除动作

Play Framework - 使用参数重定向

如何使用 Play Framework 和 videojs 流式传输视频?

Play Framework 2.4.1:如何从 JsArray 中移除元素