【问题标题】:Scala HttpPost - How to pass authentication parametersScala HttpPost - 如何传递身份验证参数
【发布时间】:2017-01-27 15:00:11
【问题描述】:

--------更新 能够通过使用 UsernamePasswordCredentials 类来修复它 代码如下所示 val 客户端 = 新的 DefaultHttpClient client.getCredentialsProvider().setCredentials(AuthScope.ANY,new UsernamePasswordCredentials("user","password"));

我正在尝试对 Restful API 进行 HttpPost 调用,它需要用户名/密码,如何传递这些参数?我尝试了两种方法

post.addHeader("Username","user")
post.addHeader("Password","clear pwd")
and 
post.addHeader("Authorization","Basic base64encoded username:password")

没有任何效果,我得到的响应文本为

响应文本 = HTTP/1.1 401 未经授权 [WWW-Authenticate: Digest realm="API Realm", domain="/default-api", nonce="pOxqalJKm5L5QXiphgFNmrtaJsh+gU", algorithm=MD5, qop="auth" , stale=true, 内容类型: text/html; charset=ISO-8859-1, Cache-Control: must-revalidate,no-cache,no-store, Content-Length: 311] org.apache.http.conn.BasicManagedEntity@5afa04c

下面是我的代码

val url = "http://restapi_url";
val post = new HttpPost(url)

//post.addHeader("Authorization","Basic QWBX3VzZXI6Q0NBQGRidHMxMjM=")
post.addHeader("Username","user_user")
post.addHeader("Password","clear pwd")
post.addHeader("APPLICATION_NAME","DO")
val fileContents = Source.fromFile("input.xml").getLines.mkString
post.setHeader("Content-type", "application/xml")
post.setEntity(new StringEntity(fileContents))

val response = (new DefaultHttpClient).execute(post)

println("Response Text = "+response.toString())

// print the response headers
println("--- HEADERS ---")
response.getAllHeaders.foreach(arg => println(arg))

【问题讨论】:

标签: scala authentication http-post


【解决方案1】:

你可以这样写,在我的程序中可以使用

import java.util.Base64

httpPost.addHeader("Authorization", "Basic " + Base64.getUrlEncoder.encodeToString("[your-username]:[your-password]".getBytes))

【讨论】:

    【解决方案2】:

    DefaultHttpClient 已弃用。您应该改用BasicCredentialsProvider。示例代码如下:

    val username = "your_username"
    val password = "your_password"
    
        val credentialsProvider = new BasicCredentialsProvider()
        credentialsProvider.setCredentials(
          AuthScope.ANY,
          new UsernamePasswordCredentials(username, password)
        )
    
    val httpClient =  HttpClientBuilder.create().setDefaultCredentialsProvider(credentialsProvider).build()
    

    【讨论】:

      【解决方案3】:

      这里的授权头应该这样计算:

      httpPost.addHeader("Authorization", "Basic " + Base64.getEncoder.encodeToString("[your-username]:[your-password]".getBytes))
      

      应该是getEncoder(),而不是getUrlEncoder()。

      【讨论】:

        猜你喜欢
        • 2019-03-25
        • 1970-01-01
        • 2016-10-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-17
        • 1970-01-01
        • 2013-04-03
        相关资源
        最近更新 更多