如何使用从批处理脚本调用的 curl 获取 http post 请求的响应代码?
How to fetch Response Code of http post request using curl invoked from a batch script?
我正在努力为从我们的一种工具发送 http post 请求提供支持。该工具基本上通过 http 请求执行作业。
实现方法是该工具使用多个参数调用 RunScript.bat。该脚本解析这些参数并在验证后发出 curl post 请求。 Post 请求由我们的内部 Java 服务处理。
我想要的是我的批处理文件应该能够获取 post 请求的响应代码(200/409 等),基于此,脚本应该 return 1 或0 作为退出值返回给工具。
然后该工具根据 return 值标记作业 pass/fail。
工具:解析 returned 值
RunScript.bat arg1 arg2 arg3
RunScript.bat
@echo off
SETLOCAL
ECHO %DATE% %TIME% Calling %0 with %*
SET "SCRIPT_DIR=%~dp0"
ECHO Script Dir %SCRIPT_DIR%
SET cmd=%1
SET val2=%2
SET val3=%3
%SCRIPT_DIR%\curl -v -X POST http://localhost:9500/%cmd%/%val2%/%val3%
是否可以在批处理脚本中获取curl请求的Response Code,然后根据Response Codereturn1/0?
我们首先需要获取curl
来输出HTTP状态。为此,我使用了 pvandenberk's answer to Getting curl to output HTTP status code?。接下来,我们必须将该输出放入一个环境变量中,以便我们可以对其进行测试。为此,我们使用 for
命令的 for /f %%a in ( 'command-to-execute' ) do ...
形式(有关详细信息,请参阅 for /?
)。
结合这些(以及其他一些小的调整),像下面这样的东西应该会有所帮助:
@echo off
SETLOCAL
ECHO %DATE% %TIME% Calling %0 with %*
SET "SCRIPT_DIR=%~dp0"
ECHO Script Dir %SCRIPT_DIR%
SET "cmd=%1"
SET "val2=%2"
SET "val3=%3"
SET "URL=http://localhost:9500/%cmd%/%val2%/%val3%"
SET HTTP=
for /f %%a in ( '"%SCRIPT_DIR%\curl" -s -o nul -v -X POST -w "%%{http_code}" "%URL%"' ) do set HTTP=%%a
if "%HTTP%" == "200" (
exit /b 0
) else (
exit /b 1
)
备注:
我假设您原来的 URL 中的 cmd
、val2
和 val3
应该被更早的内容替换环境变量,因此在构建 URL
.
时已将它们更改为 %cmd%
等
在for
语句中,要执行的整个命令用单引号括起来('.....'
)。
我将 curl 的调用用双引号括起来 ("%SCRIPT_DIR%\curl"
):即使脚本目录包含空格,这也应该允许它工作。
我在 curl 的命令行中添加了 -s
(静默)和 -o nul
(发送完整响应的位置)。这将有助于确保从 POST
请求返回的任何输出都不会干扰 HTTP 状态代码。如果您需要查看此输出,请在对 HTTP
.
进行测试之前使用 -o filename
和 TYPE
文件
-w "%%{http_code}"
中的百分号需要加倍,因为它对shell有特殊意义。
-v
(详细)的输出被发送到 stderr
,因此不应干扰捕获 HTTP 响应代码。
更新
要同时获取 HTTP 响应代码,并且仍然看到 curl 命令本身的输出,您可以尝试将上面的 for /f ...
行替换为下面的行:
for /f "delims=" %%a in ( '"%SCRIPT_DIR%\curl" -v -X POST -w "%%{http_code}" "%URL%"' ) do set "HTTP=%%a" && echo %%a
"delims="
意味着 curl 的输出行不会被拆分成单独的标记,因此 %%a
将包含每一行。
我删除了 -s
和 -o nul
选项,因此仍会生成 curl 的原始输出。
set "HTTP=%%a"
命令添加了双引号,以防止将尾随空格添加到环境变量中。因为响应代码(例如 404)是 curl 发出的最后一行,所以 HTTP
的最终值仍然是我们想要的。
echo %%a
将重播 curl 生成的所有行。
我正在努力为从我们的一种工具发送 http post 请求提供支持。该工具基本上通过 http 请求执行作业。
实现方法是该工具使用多个参数调用 RunScript.bat。该脚本解析这些参数并在验证后发出 curl post 请求。 Post 请求由我们的内部 Java 服务处理。
我想要的是我的批处理文件应该能够获取 post 请求的响应代码(200/409 等),基于此,脚本应该 return 1 或0 作为退出值返回给工具。 然后该工具根据 return 值标记作业 pass/fail。
工具:解析 returned 值
RunScript.bat arg1 arg2 arg3
RunScript.bat
@echo off
SETLOCAL
ECHO %DATE% %TIME% Calling %0 with %*
SET "SCRIPT_DIR=%~dp0"
ECHO Script Dir %SCRIPT_DIR%
SET cmd=%1
SET val2=%2
SET val3=%3
%SCRIPT_DIR%\curl -v -X POST http://localhost:9500/%cmd%/%val2%/%val3%
是否可以在批处理脚本中获取curl请求的Response Code,然后根据Response Codereturn1/0?
我们首先需要获取curl
来输出HTTP状态。为此,我使用了 pvandenberk's answer to Getting curl to output HTTP status code?。接下来,我们必须将该输出放入一个环境变量中,以便我们可以对其进行测试。为此,我们使用 for
命令的 for /f %%a in ( 'command-to-execute' ) do ...
形式(有关详细信息,请参阅 for /?
)。
结合这些(以及其他一些小的调整),像下面这样的东西应该会有所帮助:
@echo off
SETLOCAL
ECHO %DATE% %TIME% Calling %0 with %*
SET "SCRIPT_DIR=%~dp0"
ECHO Script Dir %SCRIPT_DIR%
SET "cmd=%1"
SET "val2=%2"
SET "val3=%3"
SET "URL=http://localhost:9500/%cmd%/%val2%/%val3%"
SET HTTP=
for /f %%a in ( '"%SCRIPT_DIR%\curl" -s -o nul -v -X POST -w "%%{http_code}" "%URL%"' ) do set HTTP=%%a
if "%HTTP%" == "200" (
exit /b 0
) else (
exit /b 1
)
备注:
我假设您原来的 URL 中的
cmd
、val2
和val3
应该被更早的内容替换环境变量,因此在构建URL
. 时已将它们更改为 在
for
语句中,要执行的整个命令用单引号括起来('.....'
)。我将 curl 的调用用双引号括起来 (
"%SCRIPT_DIR%\curl"
):即使脚本目录包含空格,这也应该允许它工作。我在 curl 的命令行中添加了
-s
(静默)和-o nul
(发送完整响应的位置)。这将有助于确保从POST
请求返回的任何输出都不会干扰 HTTP 状态代码。如果您需要查看此输出,请在对HTTP
. 进行测试之前使用 -w "%%{http_code}"
中的百分号需要加倍,因为它对shell有特殊意义。-v
(详细)的输出被发送到stderr
,因此不应干扰捕获 HTTP 响应代码。
%cmd%
等
-o filename
和 TYPE
文件
更新
要同时获取 HTTP 响应代码,并且仍然看到 curl 命令本身的输出,您可以尝试将上面的 for /f ...
行替换为下面的行:
for /f "delims=" %%a in ( '"%SCRIPT_DIR%\curl" -v -X POST -w "%%{http_code}" "%URL%"' ) do set "HTTP=%%a" && echo %%a
"delims="
意味着 curl 的输出行不会被拆分成单独的标记,因此%%a
将包含每一行。我删除了
-s
和-o nul
选项,因此仍会生成 curl 的原始输出。set "HTTP=%%a"
命令添加了双引号,以防止将尾随空格添加到环境变量中。因为响应代码(例如 404)是 curl 发出的最后一行,所以HTTP
的最终值仍然是我们想要的。echo %%a
将重播 curl 生成的所有行。