Grails POST请求如何获取返回的access_token与instance_url
解决Grails中HTTPBuilder POST请求提取返回数据的问题
我来帮你搞定这个提取返回数据的事儿!既然你的请求已经成功(没触发catch块),说明请求本身是通的,核心就是正确解析并提取响应里的JSON数据。下面给你完整的代码示例和关键说明:
完整的代码实现
import groovyx.net.http.HTTPBuilder import static groovyx.net.http.ContentType.JSON import static groovyx.net.http.Method.POST // 替换成你的Salesforce登录域名和登录参数 def sf_login_domain = "https://login.salesforce.com/services/oauth2/token" def loginParams = [ grant_type: "password", client_id: "你的Client ID", client_secret: "你的Client Secret", username: "你的Salesforce用户名", password: "你的密码+安全令牌" ] def accessToken // 用于存储提取到的Token def instanceUrl // 用于存储提取到的访问路径 def http = new HTTPBuilder(sf_login_domain) try { http.request(POST, JSON) { req -> // 设置POST请求体参数 body = loginParams // 指定接受JSON格式的响应 headers.Accept = JSON.toString() // 处理请求成功的响应(状态码2xx) response.success = { resp, json -> // 直接通过点语法提取JSON字段 accessToken = json.access_token instanceUrl = json.instance_url // 打印验证(可根据需求删除) println "✅ 成功获取Access Token: ${accessToken}" println "✅ 成功获取Instance URL: ${instanceUrl}" } // 可选:处理请求失败的响应(状态码4xx/5xx) response.failure = { resp, json -> println "❌ 请求失败,状态码: ${resp.statusLine.statusCode}" println "❌ 错误详情: ${json}" } } } catch (Exception e) { println "❌ 请求发生异常: ${e.getMessage()}" e.printStackTrace() } // 后续业务逻辑中可以直接使用accessToken和instanceUrl if (accessToken && instanceUrl) { println "准备使用Token访问Salesforce API..." // 比如调用其他Salesforce接口:new HTTPBuilder(instanceUrl) }
关键说明
- 指定响应格式:请求时传入
JSON作为第二个参数,HTTPBuilder会自动把响应解析为Groovy可直接操作的JSON对象(本质是Expando或Map)。 - 成功响应处理:在
response.success闭包里,第二个参数json就是解析后的响应数据,直接用点语法(json.access_token)就能拿到对应字段——Groovy对下划线命名的字段支持很友好,不用额外处理。 - 变量作用域:在闭包外定义
accessToken和instanceUrl,可以在闭包里赋值,后续代码就能直接使用这两个值。
注意点
- 确认你的
sf_login_domain是正确的Salesforce OAuth端点:生产环境用https://login.salesforce.com/services/oauth2/token,沙箱环境用https://test.salesforce.com/services/oauth2/token。 - 如果你的请求体是form-urlencoded格式(而非JSON),只需把
ContentType.JSON换成ContentType.URLENC,其他逻辑不变。
内容的提问来源于stack exchange,提问作者Marcius Leandro
相关产品推荐
相关产品推荐

