【问题标题】:how to extract response as json from http ng-builder如何从http ng-builder中提取响应为json
【发布时间】:2019-07-04 16:34:08
【问题描述】:

在浏览器中点击 URI myresourceUrl 时显示浏览器中的 json 内容。

要求: 需要使用httpbuilder-ng的get方法调用URI的GET,response的内容为json。

这个 json 文件将是另一个任务的输入。 如何实现这一点。我们是否需要任何解析器来使用 http-builder-ng 将返回的响应作为 json 获取。

预期响应格式: {"name":"Abc","info":{"age":45,"height":"5.5"}}

Tried the below get request using:
// setting the request URI 
    HttpBuilder http = HttpBuilder.configure(config -> {
                    config.getRequest().setUri(myresourceUrl);
                });

String response = http.get(LazyMap.class, cfg -> {
                    cfg.getRequest().getUri().setPath(myPath);
                }).toString();

实际格式我们得到: {姓名:Abc,信息:{年龄:45,身高:5.5}}

如何以预期的响应格式获得上述响应。

【问题讨论】:

    标签: httpbuilder httpbuilder-ng


    【解决方案1】:

    默认情况下,“application/json”的内容类型将被解析,而不是作为字符串返回。您需要为内容类型定义一个自定义解析器。我使用一个返回“application/json”内容的假服务器组合了一个示例,然后展示了如何在 HttpBuilder-NG 中将其作为字符串返回:

    import com.stehno.ersatz.ErsatzServer;
    import groovyx.net.http.HttpBuilder;
    
    import static com.stehno.ersatz.ContentType.APPLICATION_JSON;
    import static groovyx.net.http.NativeHandlers.Parsers.textToString;
    
    public class Runner {
    
        public static void main(final String[] args) {
            final ErsatzServer server = new ErsatzServer();
    
            server.expectations(expects -> {
                expects.get("/something").responder(response -> {
                    response.body("{\"name\":\"Abc\",\"info\":{\"age\":45,\"height\":\"5.5\"}}", APPLICATION_JSON);
                });
            });
    
            final String response = HttpBuilder.configure(cfg -> {
                cfg.getRequest().setUri(server.getHttpUrl());
                cfg.getResponse().parser("application/json", (chainedHttpConfig, fromServer) -> textToString(chainedHttpConfig, fromServer));
            }).get(String.class, cfg -> {
                cfg.getRequest().getUri().setPath("/something");
            });
    
            System.out.println(response);
            System.exit(0);
        }
    }
    

    注意 cfg.getResponse().parser("application/json", (chainedHttpConfig, fromServer) -> textToString(chainedHttpConfig, fromServer)); 行,这是解析发生的地方(覆盖默认行为) - 另请参阅导入 import static groovyx.net.http.NativeHandlers.Parsers.textToString;

    【讨论】:

      【解决方案2】:

      首先,确认您的 http 请求确实返回了 JSON 响应。如果是这样,您可以使用gson 库。试试

      import com.google.code.gson;
      String response = gson.toJSON(http.get(LazyMap.class, cfg -> {
                      cfg.getRequest().getUri().setPath(myPath);
                  }));
      

      【讨论】:

      • 它给出错误'类型不匹配:无法从 LazyMap 转换为字符串'
      • 查看下面的更新代码。如果您尝试检查它或打印到控制台,您会得到什么值的响应?
      • 代码是用java编写的。所以我不能将响应变量声明为 var。
      • 好的,在我放弃之前还有一个建议 - 请参阅有关使用 gson 库的更新答案。如果上面的代码不起作用,请尝试阅读 gson 库,它是在 java 中处理 JSON 的好工具。