Scala - POST 请求的 URL 编码问题

问题描述 投票:0回答:1

我有一个奇怪的 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 http curl post
1个回答
0
投票

我正在研究不同的库,特别是对于 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)
© www.soinside.com 2019 - 2024. All rights reserved.