如何使用批处理脚本调用的curl 获取http post 请求的响应代码?

PeX*_*XeR 5 curl http batch-file httpresponse return-value

我正在努力为从我们的工具之一发送 http post 请求提供支持。该工具基本上通过 http 请求执行作业。

实现此目的的方法是该工具使用多个参数调用 RunScript.bat。该脚本解析这些参数并在验证后发出curl post 请求。Post 请求由我们内部的 Java 服务处理。

我想要的是我的批处理文件应该能够获取发布请求的响应代码(200/409 等),并且基于此,脚本应该返回 1 或 0 作为退出值返回到工具。然后,该工具根据返回值标记作业通过/失败。

工具:解析返回值

RunScript.bat arg1 arg2 arg3

运行脚本.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%
Run Code Online (Sandbox Code Playgroud)

是否可以在批处理脚本中获取curl请求的Response Code,然后根据Response Code返回1/0?

Tri*_*und 5

我们需要做的第一件事是输出curlHTTP 状态。为此,我使用了pvandenberkGetting curly to output HTTP status code?的回答。。接下来,我们必须将该输出放入环境变量中,以便我们可以测试它。为此,我们使用命令for /f %%a in ( 'command-to-execute' ) do ...的形式forfor /?更多详细信息,请参阅 参考资料)。

结合这些(以及其他一些小的调整),类似以下内容应该会有所帮助:

@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
)
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 我假设cmd,val2val3在你的原始 URL 中应该被替换为早期环境变量的内容,所以%cmd%在构建 时将它们更改为等URL

  • 在该for语句中,整个要执行的命令用单引号 ( '.....') 括起来。

  • 我已将curl 的调用括在双引号( "%SCRIPT_DIR%\curl") 中:即使脚本目录包含空格,这也应该允许它工作。

  • 我已将-s(静默)和-o nul(发送完整响应的位置)添加到curl 的命令行中。这将有助于确保从POST请求返回的任何输出不会干扰 HTTP 状态代码。如果您需要查看此输出,请在对 进行测试之前使用-o filename和该文件。TYPEHTTP

  • 百分号-w "%%{http_code}"需要加倍,因为它对 shell 有特殊含义。

  • (verbose)的输出-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
Run Code Online (Sandbox Code Playgroud)
  • "delims="意味着curl 的输出行不会被分割成单独的标记,因此%%a将保存整个每行。

  • 我已经删除了-s-o nul选项,因此仍会生成curl 的原始输出。

  • set "HTTP=%%a"命令添加了双引号,以防止将尾随空格添加到环境变量中。因为响应代码(例如404)是curl发出的最后一行,所以最终的值HTTP仍然是我们想要的。

  • echo %%a重播由curl生成的所有行。