如何获取正确的链接格式 解决OAuth2授权链接含空格参数拼接错误问题
你当前的实现逻辑存在两个核心错误:
- 不需要对拼接后的原始URL做解码操作,原始字符串没有经过编码,解码无意义还可能引入额外异常
- 对完整URL做整体编码会把URL结构中的
?、&、=等合法分隔符也转义,直接破坏链接结构,导致完全无法正常跳转
解决思路
OAuth2授权链接中,只有response_type、scope这类参数的参数值里的空格属于需要编码的特殊字符,编码后对应%20,你可以选择两种方案处理:
方案1:手动编码参数值后拼接
operator fun invoke(consentId: String): String { // 单独对带空格的参数值做URL编码 val encodedResponseType = "code id_token".replace(" ", "%20") val encodedScope = "openid accounts".replace(" ", "%20") // 直接拼接编码后的参数 return "$authorizeUrl?client_id=$clientId&response_type=$encodedResponseType&scope=$encodedScope&redirect_uri=$redirect_uri&request=$consentId" }
方案2(更推荐):使用官方URI构建工具自动处理编码
不用自己关心哪些字符需要转义,工具会自动处理所有参数值的编码,避免手动拼接出错,以Android的Uri.Builder为例:
import android.net.Uri operator fun invoke(consentId: String): String { return Uri.parse(authorizeUrl) .buildUpon() .appendQueryParameter("client_id", clientId) .appendQueryParameter("response_type", "code id_token") .appendQueryParameter("scope", "openid accounts") .appendQueryParameter("redirect_uri", redirect_uri) .appendQueryParameter("request", consentId) .build() .toString() }
日志截断说明
日志中显示省略号是日志组件默认对长文本做了截断,和链接本身是否正确无关。你可以通过断点调试、控制台全量打印返回值的方式验证格式,只要参数中的空格都被替换为%20就符合URL规范。
内容的提问来源于stack exchange,提问作者Morozov
相关产品推荐
相关产品推荐

