Groovy/Grails HTTPBuilder 自动 JSON 解析

问题描述 投票:0回答:1

Groovy 2.4.14、Grails 2.5.6、JVM 1.8、MacOS

我正在尝试(并成功)使用 UPS(联合包裹服务)API 来获取给定追踪号码的追踪信息。该代码有效,UPS 返回一个 JSON 字符串(和

Content-Type: application/json
)。我可以解析 JSON 并且得到我需要的东西。

但是,我更喜欢 HTTPBuilder 进行 JSON 解析,因为它给我的东西有点奇怪。我返回一个 HashMap,第一个键是 JSON 主体,值是

null
。像这样:

{ "JSON stuff": null }

所以我可以解析它并使用普通的 Groovy 工具获得可用的结构:

def json = JSON.parse(data.keySet()[0])

我怀疑唯一可能有帮助的是将“Accept”标头设置为 JSON,但这没有效果。

这是 HTTPBuilder 代码:

def trackingGroup(String tracking) {
    def result;

    try {
        HTTPBuilder http = new HTTPBuilder(urlbase)
        http.request(Method.GET, ContentType.URLENC) { req ->
            uri.path = "/api/track/v1/shipment/details/${tracking}";

            requestContentType = ContentType.URLENC;
            headers['Authorization'] = "Bearer ${TOKS.getToken()}"
            headers['User-Agent'] = "Me";
            headers['Accept'] = ContentType.JSON;
            headers['transId'] = "testing"
            headers['transactionSrc'] = "testing"

            response.success = { resp, json ->
                result = json
            }
            response.failure = { resp, json ->
                result = json
            }
        }
    }
    catch (error) {
        error.printStackTrace();
        result = null
    }

    if (result == null) return "total failure";

    result = JSON.parse(result.keySet()[0])

    List alltrack = [];
    result.trackResponse.shipment.each { shipment ->
        shipment.package.each { p ->
            alltrack << p.trackingNumber
        };
    };

    return alltrack;
}

我在任何地方都找不到关于

groovyx.net.http
包的 Groovy/Grails 版本的好文档,所以我要问的是,是否有东西可以在
.request()
调用的闭包参数中调用来告诉它假设 JSON 并解析它。

http groovy grails
1个回答
0
投票

尝试将

ContentType.JSON
而不是
ContentType.URLENC
传递给
http.request
调用。根据文档,它指的是预期的内容类型。

© www.soinside.com 2019 - 2024. All rights reserved.