Ktor客户端请求身份验证Header失效,调用Persona API遭拒
Ktor调用Persona API持续返回身份验证失败错误
使用Ktor库向Persona API发送请求时,反复收到如下错误响应:
{"errors":[{"title":"Must be authenticated to access this endpoint"}]}
已通过Python和Volley库测试该请求,均可正常获取JSON响应,说明Persona API本身功能正常。
我尝试过以下解决方案,但均未解决问题:
- 在
DefaultRequest中直接添加身份验证Header:
install(DefaultRequest){ header("accept", "application/json") header("Persona-Version", "2023-01-05") header("authorization", "Bearer API_KEY") }
- 使用
HttpHeaders常量配置Header:
install(DefaultRequest){ header(HttpHeaders.ContentType, ContentType.Application.Json) header("Persona-Version", "2023-01-05") header(HttpHeaders.Authorization, "Bearer API_KEY") }
- 按照Persona API文档,通过Auth插件配置Bearer令牌:
install(Auth){ bearer{ loadTokens{ BearerTokens(API_KEY, API_KEY) } } }
- 直接在Get请求中添加Header
以下是当前的完整代码:
import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.recyclerview.widget.RecyclerView import io.ktor.client.* import io.ktor.client.call.* import io.ktor.client.engine.android.Android import io.ktor.client.plugins.ClientRequestException import io.ktor.client.plugins.DefaultRequest import io.ktor.client.plugins.RedirectResponseException import io.ktor.client.plugins.ServerResponseException import io.ktor.client.plugins.contentnegotiation.* import io.ktor.client.plugins.logging.* import io.ktor.client.request.* import io.ktor.client.statement.* import io.ktor.http.* import io.ktor.serialization.kotlinx.json.* import io.ktor.server.application.* import kotlinx.coroutines.* import kotlinx.serialization.* import kotlinx.serialization.json.Json import io.ktor.client.plugins.auth.* import io.ktor.client.plugins.auth.providers.BearerTokens import io.ktor.client.plugins.auth.providers.bearer import io.ktor.client.plugins.defaultRequest import kotlinx.serialization.json.JsonArray import org.json.JSONObject const val TAG = "MainActivity" class MainActivity : AppCompatActivity() { private val coroutineScope = CoroutineScope(Dispatchers.Main) private val httpClient = HttpClient(Android) { install(ContentNegotiation) { json(Json{ prettyPrint = true isLenient = true }) install(Logging){logger = Logger.DEFAULT level = LogLevel.ALL } install(DefaultRequest){ header("accept", "application/json") header("Persona-Version", "2023-01-05") header("authorization", "Bearer API KEY") } install(Auth){ bearer{ loadTokens{ BearerTokens(API KEY, API KEY) } } } } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) coroutineScope.launch { try { val posts = httpClient.get { url("https://withpersona.com/api/v1/accounts") } println(posts.bodyAsText()) } catch(e: RedirectResponseException){ // 3xx - responses println("Error: ${e.response.status.description}") } catch(e: ClientRequestException){ // 4xx - responses println("Error: ${e.response.status.description}") } catch(e: ServerResponseException){ //3xx - responses println("Error: ${e.response.status.description}") } catch(e: Exception){ println("Error: ${e.message}") } httpClient.close() } } }
内容的提问来源于stack exchange,提问作者Jake Ramirez
相关产品推荐
相关产品推荐

