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

将curl POST请求转换为Grails HTTPBuilder请求并提取sid

问题分析与解决方案

你的问题核心是HTTPBuilder解析JSON数组响应时未正确处理数组结构,导致提取sid得到null。以下是具体的排查点和正确实现代码:

关键错误点

  1. 响应是JSON数组而非单个对象:你尝试直接访问json.sid,但实际响应是[]包裹的数组,必须先获取数组第一个元素再提取sid。
  2. 未明确指定响应解析类型:如果HTTPBuilder未被配置为自动解析JSON,返回的可能是原始字符串而非可操作的JSON结构。
  3. 请求体需严格匹配curl的JSON数组格式:确保POST的body是包含登录对象的数组,而非单个对象。

正确实现代码

方式一:使用HTTPBuilder核心类

import groovyx.net.http.HTTPBuilder
import static groovyx.net.http.ContentType.JSON
import static groovyx.net.http.Method.POST

// 初始化HTTPBuilder,忽略SSL证书验证(对应curl的-k参数)
def http = new HTTPBuilder('https://TheIpAddress/')
http.ignoreSSLIssues()

def targetSid = null

http.request(POST, JSON) { req ->
    // 设置请求路径和查询参数
    uri.path = '/ajax'
    uri.query = [sid: '']

    // 匹配curl的请求头
    headers.'Content-Type' = 'application/json'
    headers.'Accept' = 'application/json,text/javascript'

    // 构造JSON数组格式的请求体
    body = [
        [command: 'system.login', password: 'guesswhatIam', user: 'theuser']
    ]

    // 处理成功响应
    response.success = { resp, json ->
        // 验证响应是数组且非空,再提取第一个元素的sid
        if (json instanceof List && !json.isEmpty()) {
            targetSid = json[0].sid
        }
    }
}

println "提取的sid值:${targetSid}"

方式二:使用RESTClient(更简洁)

import groovyx.net.http.RESTClient
import static groovyx.net.http.ContentType.JSON

def restClient = new RESTClient('https://TheIpAddress/')
restClient.ignoreSSLIssues()

// 发送POST请求
def response = restClient.post(
    path: '/ajax',
    query: [sid: ''],
    headers: [
        'Content-Type': 'application/json',
        'Accept': 'application/json,text/javascript'
    ],
    body: [
        [command: 'system.login', password: 'guesswhatIam', user: 'theuser']
    ],
    requestContentType: JSON
)

// 解析响应提取sid
if (response.status == 200 && response.data instanceof List && !response.data.isEmpty()) {
    def targetSid = response.data[0].sid
    println "提取的sid值:${targetSid}"
}

额外排查建议

  • 若仍无法解析,可在响应处理中打印原始响应内容,确认返回的JSON结构是否与预期一致:
    response.success = { resp, json ->
        println "原始响应:${json.toString()}"
    }
    
  • 检查项目依赖是否正确引入HTTPBuilder,Grails项目的build.gradle需添加:
    implementation 'org.codehaus.groovy.modules.http-builder:http-builder:0.7.2'
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:42:34