You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:54:55