You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Groovy/Grails中HTTPBuilder无法自动解析JSON,求正确配置方法

解决Groovy HTTPBuilder自动解析UPS API JSON的问题

环境

  • Groovy 2.4.14
  • Grails 2.5.6
  • JVM 1.8
  • MacOS

问题详情

调用UPS API获取运单跟踪信息时,API返回Content-Type: application/json格式的JSON字符串,但HTTPBuilder未自动解析响应,反而返回一个异常的HashMap:

{ "JSON stuff": null }

目前只能通过JSON.parse(data.keySet()[0])手动解析得到可用结构,尝试设置Accept请求头为JSON也无效。

解决方案

问题根源在于HTTPBuilder的请求配置错误,调整以下两点即可实现自动解析:

  1. 指定正确的响应内容类型
    将http.request(Method.GET, ContentType.URLENC)中的第二个参数改为ContentType.JSON,该参数用于告知HTTPBuilder你期望的响应格式,框架会自动匹配并解析对应类型的响应。

  2. 移除不必要的请求体类型配置
    GET请求通常没有请求体,因此删除requestContentType = ContentType.URLENC这行配置,该参数仅用于POST/PUT等带请求体的请求。

修改后的核心代码

def trackingGroup(String tracking) {
    def result;

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

            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 // 此处json已为解析后的Groovy对象
            }
            response.failure = { resp, json ->
                result = json
            }
        }
    }
    catch (error) {
        error.printStackTrace();
        result = null
    }

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

    // 移除手动解析的代码
    List alltrack = [];
    result.trackResponse.shipment.each { shipment ->
        shipment.package.each { p ->
            alltrack << p.trackingNumber
        };
    };

    return alltrack;
}

调整后,HTTPBuilder会自动将UPS返回的JSON响应解析为Groovy原生的Map/List结构,无需再手动处理原始JSON字符串。

内容的提问来源于stack exchange,提问作者Pointy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 09:40:22