【发布时间】:2021-03-18 08:23:52
【问题描述】:
更新 我的问题原来是由于一些超类的怪异。但是,此示例中的 urlEncode 是错误的。在这种情况下,它也是不必要的。如果需要,应该通过每个键和值来完成,而不需要编码 & 或 =。 除此之外,这段代码是正确的。
下面的 (scala) 代码失败,因为服务器似乎没有收到正文。 服务器日志上的警告是:
警告 *** OAuthTokenProcessor 捕获了带有消息 OAuthProblemException{error='invalid_request', description='Missing grant_type parameter value', uri='null', state='null', scope='null', redirectUri= 的 OAuthRequestProblemException 'null',responseStatus=0,参数={}}
我确信参数是正确的。网址正确,标题正确 (这个调用已经在 Postman 和 Python 中有效)
非常感谢任何提示!
private def doPostRequest(): Unit ={
try {
val connectionforPost = (new URL(url)).openConnection.asInstanceOf[HttpURLConnection]
val params = "grant_type=password&client_id=xxxx&client_secret=seccret&username=admin&password=xxxx"
val encodedString = URLEncoder.encode(params,"UTF-8")
import java.nio.charset.StandardCharsets
val postData = encodedString.getBytes(StandardCharsets.UTF_8)
val contentlength = Integer.toString(encodedString.length)
connectionforPost.setConnectTimeout(50000)
connectionforPost.setReadTimeout(50000)
connectionforPost.setRequestMethod("POST")
connectionforPost.setDoOutput(true)
connectionforPost.setDoInput(true)
connectionforPost.setInstanceFollowRedirects(false)
connectionforPost.setRequestProperty("User-agent", "test bot")
connectionforPost.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
connectionforPost.setRequestProperty("Accept", "*/*")
connectionforPost.setRequestProperty("Connection", "keep-alive")
connectionforPost.setRequestProperty("Content-Length", contentlength)
connectionforPost.setRequestProperty("Accept-Encoding", "gzip, deflate")
connectionforPost.setUseCaches(false)
import java.io.DataOutputStream
val wr = new DataOutputStream(connectionforPost.getOutputStream)
wr.write(postData)
if (wr != null) wr.close()
} catch{
case e:Exception => logger.error(e.getMessage,e)
throw e
}
}
【问题讨论】:
-
encodedString的值是多少? -
grant_type%3Dpassword%26client_id%3Dxxxxx%26client_secret%3Dsecret%26username%3Dadmin%26password%3Dxxxx
-
您已经对 '=' 和 '&' 字符进行了编码。如果它们出现在您传递的值中,则需要对其进行编码,但不应将它们编码在帖子的正文中
-
试着看看工作请求和不工作请求之间的确切区别是什么。使用工具在低级别记录请求。
-
有一个选项可以在邮递员中查看整个 curl 请求。它将帮助您找到差异。
标签: java scala httpurlconnection