CURL 错误:执行 API POST 时出现“URL 被拒绝:主机名错误”

CURL Error: "URL rejected: Bad hostname" When executing API POST

提问人:executable 提问时间:11/17/2023 最后编辑:Compoexecutable 更新时间:11/17/2023 访问量:66

问:

我有一个批处理脚本,旨在在远程服务器(即网站)上启动 Windows 服务。然后,该脚本每 10 秒检查一次网站是否使用 CURL 启动。网站启动后,它继续使用 CURL 执行 API POST 命令。

但是,我遇到了一个问题,即脚本在执行过程中输出错误,特别是“URL rejected: Bad hostname”。 脚本如下:

@ECHO OFF
setlocal enabledelayedexpansion
echo Starting website
ssh [email protected] "cmd.exe /c sc start ""Website-Service"">nul"
for /l %%i in (1,1,10) do (
    curl --head --fail --silent "http://10.172.0.1:3000/browse" > nul 2>&1 && (
        echo Configuring website
        curl -X POST -H "Content-Type: application/json" -d "{\"username\": \"[email protected]\", \"password\": \"aaA_aAaaaaAA?\"}" http://10.172.0.1:3000/api/session 2^>^&1 | C:\wamp64\www\utils\syncLCH\jq-windows-amd64.exe -r ".id" > C:\wamp64\www\_tmp\token.txt
        set /p token=<C:\wamp64\www\_tmp\token.txt
        del C:\wamp64\www\_tmp\token.txt
        echo %token%
        REM run api using the token
        exit /b
    ) || (
        echo Website is down. Attempt %%i of 10.
        timeout /nobreak /t 10 > nul
    )
)
echo Maximum attempts reached. Exiting script.

该脚本成功启动服务并检查网站状态,但在 API POST 命令期间遇到“URL 被拒绝:URL 函数的格式错误输入”错误。奇怪的是,在命令行界面中运行相同的命令会从 API 产生预期的结果。

是什么原因导致了脚本中的此错误,如何解决它以成功检索身份验证令牌?

输出如下:

Starting website
Website is down. Attempt 1 of 10.
Website is down. Attempt 2 of 10.
Configuring website
curl: (3) URL rejected: Malformed input to a URL function
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   131  100    59  100    72    691    843 --:--:-- --:--:-- --:--:--  1541
curl: (3) URL rejected: Bad hostname
ECHO command disabled.
Windows 批处理文件 curl

评论

0赞 xpusostomos 11/17/2023
这与 bash 无关
0赞 Compo 11/17/2023
有一件事是肯定的,必须至少改变。echo %token%echo !token!
0赞 Mofi 11/18/2023
"{\"username\": \"[email protected]\", \"password\": \"aaA_aAaaaaAA?\"}"是 Linux/Mac shell 解释器语法,而不是 Windows 命令处理器的有效语法。将 JSON 格式的数据传递给引用的最佳方法,始终使用其完全限定的文件名,而不仅仅是将数据写入文件,并使用 Curl 从文件而不是命令提示符窗口读取数据的选项。用户名和密码是保存在批处理文件还是单独的文本文件中并不重要。curl%SystemRoot%\System32\curl.execurl
0赞 Mofi 11/18/2023
我建议在批处理文件的目录中创建一个文本文件。然后在批处理文件中使用,而不是 .Credentials.json{"username": "[email protected]", "password": "aaA_aAaaaaAA?"}%SystemRoot%\System32\curl.exe --json "@%~dp0Credentials.txt" http://10.172.0.1:3000/api/session 2>&1curl -X POST -H "Content-Type: application/json" -d "{\"username\": \"[email protected]\", \"password\": \"aaA_aAaaaaAA?\"}" http://10.172.0.1:3000/api/session 2^>^&1
0赞 Mofi 11/18/2023
curl --head --fail --silent "http://10.172.0.1:3000/browse" > nul 2>&1还应该进行优化,以加快执行速度。Curl 有很多命令行选项,非常值得阅读 Curl 手册或完整的 Curl 文档以获取命令行选项%SystemRoot%\System32\curl.exe --head --fail --silent -o nul -stderr - http://10.172.0.1:3000/browse

答: 暂无答案