如何从ContentResponse同时返回accessToken与refreshToken两个字符串?
问题
当前代码仅返回ContentResponse中的accessToken字符串,代码如下:
return body.encodeResponse(for: request) .map { $0.body.buffer } .flatMap { buffer in return request.client.post(url, headers: self.callbackHeaders) { $0.body = buffer } }.flatMapThrowing { response in return try response.content.get(ContentResponse.self) }.map { $0.accessToken }
该返回值在如下完成处理程序中接收:
return try self.fetchToken(from: request).flatMap { accessToken in
需要修改代码,以同时返回ContentResponse中的accessToken和refreshToken两个字符串,求结构修改方案。
解决方案
可以通过返回元组或自定义结构体的方式同时携带两个token,具体修改如下:
方案一:使用元组(轻量快捷)
- 修改
fetchToken的返回映射逻辑
把最后一步返回单个accessToken的逻辑,改成返回包含两个token的元组:
return body.encodeResponse(for: request) .map { $0.body.buffer } .flatMap { buffer in return request.client.post(url, headers: self.callbackHeaders) { $0.body = buffer } }.flatMapThrowing { response in return try response.content.get(ContentResponse.self) }.map { ($0.accessToken, $0.refreshToken) } // 返回(accessToken, refreshToken)元组
- 修改接收处的代码
在调用fetchToken的地方,通过元组解构直接获取两个token:
return try self.fetchToken(from: request).flatMap { (accessToken, refreshToken) in // 此处可直接使用accessToken和refreshToken做后续处理 }
方案二:使用自定义结构体(可读性更强)
如果需要更清晰的语义,可自定义结构体封装两个token:
- 定义封装结构体
struct TokenPair: Codable { let accessToken: String let refreshToken: String }
- 修改
fetchToken的返回映射逻辑
return body.encodeResponse(for: request) .map { $0.body.buffer } .flatMap { buffer in return request.client.post(url, headers: self.callbackHeaders) { $0.body = buffer } }.flatMapThrowing { response in return try response.content.get(ContentResponse.self) }.map { content in TokenPair(accessToken: content.accessToken, refreshToken: content.refreshToken) }
- 修改接收处的代码
return try self.fetchToken(from: request).flatMap { tokenPair in let accessToken = tokenPair.accessToken let refreshToken = tokenPair.refreshToken // 业务逻辑处理 }
内容的提问来源于stack exchange,提问作者RanLearns
相关产品推荐
相关产品推荐

