首页 > 解决方案 > 在 Scala 中调用 API 时传递凭据

问题描述

我正在尝试使用 HttpGet 调用 REST 端点并传递用户凭据。

var content = ""
val httpClient : CloseableHttpClient = HttpClients.createDefault();
val httpResponse = new HttpGet(url)
httpResponse.addHeader(BasicScheme.authenticate(new UsernamePasswordCredentials(“uname”,”pwd”),”UTF-8", false))
val response = httpClient.execute(httpResponse)
val entity = httpResponse.getEntity()
val inputStream = entity.getContent()
content = fromInputStream(inputStream).getLines.mkString
inputStream.close
httpClient.getConnectionManager().shutdown()
return content

看起来 BasicScheme 在“org.apache.http.impl.auth”中已被弃用。关于如何前进的任何指示......在此先感谢。

标签: javascalarest

解决方案


鉴于您正在尝试使用基本身份验证,这应该足够了

val credentialsProvider = new BasicCredentialsProvider()
credentialsProvider.setCredentials(
    AuthScope.ANY, 
    new UsernamePasswordCredentials("username", "password")
)

val httpClient = 
    HttpClientBuilder.create()     
                     .setDefaultCredentialsProvider(credentialsProvider)
                     .build()

val httpResponse = new HttpGet(url)
httpClient.execute(httpResponse)

如果您更喜欢使用简单的 HTTP标头,则可以使用

def buildEncodedCredentials(): String = {
    val credentialsString = username + ":" + password
    val charset = StandardCharsets.ISO_8859_1
    val encodedBytes = Base64.getEncoder().encode(credentialsString.getBytes(charset))
    return new String(encodedBytes, charset)
}

 httpResponse.addHeader(HttpHeaders.AUTHORIZATION, "Basic " + buildEncodedCredentials())

推荐阅读