我有一个奇怪的 HTTP 问题,该问题在
curl
中有效,但当我在 Scala 脚本中使用 HttpURLConnection
中的 java.net
时却不起作用。
我有一个如下所示的curl命令:
curl --location 'https://some.url.com/api/endpoint' \
--header 'Content-Type application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode '[email protected]' \
--data-urlencode 'client_secret=abcdeg123456'
此命令有效,我从服务器收到了有效的响应。
现在我在 scala 脚本中做同样的事情(为了更好的阅读而进行了简化):
val url = "https://some.url.com/api/endpoint"
val headerParams = "grant_type=client_credentials&[email protected]&client_secret=abcdeg123456"
val postData = headerParams.getBytes(StandardCharsets.UTF_8)
val postDataLength = postData.length
val connection: HttpURLConnection = new URL(url).openConnection.asInstanceOf[HttpURLConnection]
connection.setConnectTimeout(10000)
connection.setRequestMethod("POST")
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded")
connection.setDoOutput(true)
connection.setUseCaches(false)
connection.setRequestProperty("charset", "utf-8")
connection.setRequestProperty("Content-Length", postDataLength.toString)
// skipping the resource closing part for better reading
val outputStream = new DataOutputStream(connection.getOutputStream)
outputStream.write(postData)
val inputStream = connection.getInputStream
// print the result
println(
scla.io.Source.fromInputStream(inputStream).mkString
)
这个 Scala 脚本也给出了有效的响应,与curl命令相同。所以我知道我的脚本有效。
现在我有一个新用户,并且在电子邮件地址中添加了标签,突然我的 scala 脚本停止工作。
新用户现在是
[email protected]
,添加了 +api
标签,并且客户端 ID 也发生了更改。
使用新的curl命令,它仍然有效,并且我得到了有效的响应。
curl --location 'https://some.url.com/api/endpoint' \
--header 'Content-Type application/x-www-form-urlencoded' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode '[email protected]' \
--data-urlencode 'client_secret=123456abcdefg'
但是如果我修改我的 scala 脚本:
...
val headerParams = "grant_type=client_credentials&[email protected]&client_secret=123456abcdefg"
...
然后我突然收到服务器的
500
响应。但我知道它在curl中有效。
您知道我在 Scala 脚本中编码标头参数的方式是否有问题吗?或者至少我如何更好地调试它。
谢谢, 菲利克斯
我正在研究不同的库,特别是对于 Scala,其中大部分繁重的工作都发生在幕后。
我从 lihaoyi 找到了这个库,它对我来说非常有用。
依赖性:
"com.lihaoyi" %% "requests" % "0.8.0"
val url = "https://some.url.com/api/endpoint"
val headerParams = Map(
"client_id" -> "[email protected]"
"client_secret" -> "123456abcdefg"
)
val response = requests.post(url, headerParams)
println(response.text)