Groovy如何为URL()/JsonSlurper()添加认证解决401未授权问题
问题原因与正确实现
你两个实现返回401的核心原因有3个:
- 第一个方案错误使用了不存在的
User请求头:curl的--user "username:apitoken"是命令行参数,作用是自动生成标准HTTP Basic认证的Authorization头,不是向服务端传名为User的请求字段,这个头对GitHub服务端完全无效。 - 第二个方案的Base64编码结果未转字符串:Groovy中
byte[].encodeBase64()返回的是字节数组对象,直接拼接进字符串会得到类似[B@2d38f12a的对象地址字符串,不是合法的Base64认证串。 - 两个方案都遗漏了curl命令中携带的
Accept: application/vnd.github.v3+json请求头,多数GitHub Enterprise实例开启了API版本强制校验,缺少该头时即使认证信息正确也会被拦截返回401。
可直接运行的正确代码
import groovy.json.JsonSlurper // 生成合法的Basic认证串,编码后必须转成字符串 def authStr = "${gitApiUser}:${gitApiToken}".getBytes("UTF-8").encodeBase64().toString() def requestUrl = "${gitUrl}/api/v3/repos/projectname/reponame/pulls?page=${page}&state=all&sort=recentupdate" String json = new URL(requestUrl).getText( requestProperties: [ "Accept": "application/vnd.github.v3+json", "Content-Type": "application/json", "Authorization": "Basic ${authStr}" ] ) prData = new JsonSlurper().parse(json.bytes)
如果当前Groovy版本对URL的getText传参兼容性不好,可以换用更稳定的HttpURLConnection写法,避免框架层面的参数透传问题:
import groovy.json.JsonSlurper def authStr = "${gitApiUser}:${gitApiToken}".getBytes("UTF-8").encodeBase64().toString() def requestUrl = "${gitUrl}/api/v3/repos/projectname/reponame/pulls?page=${page}&state=all&sort=recentupdate" def conn = new URL(requestUrl).openConnection() as HttpURLConnection conn.setRequestMethod("GET") conn.setRequestProperty("Accept", "application/vnd.github.v3+json") conn.setRequestProperty("Content-Type", "application/json") conn.setRequestProperty("Authorization", "Basic ${authStr}") String json = conn.inputStream.getText("UTF-8") prData = new JsonSlurper().parse(json.bytes)
额外注意点
- 认证串编码统一用UTF-8即可,不需要使用iso-8859-1,GitHub官方文档明确要求Basic认证的用户名密码串使用UTF-8编码后做Base64转换。
- 如果使用GitHub个人访问令牌(PAT),也可以省略用户名拼接步骤,直接用
Authorization: Token ${yourPatToken}的头格式,不需要手动做Base64编码,写法更简洁。
内容的提问来源于stack exchange,提问作者mles
相关产品推荐
相关产品推荐

