我正在努力为从我们的工具之一发送 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%
是否可以在批处理脚本中获取curl请求的Response Code,然后根据Response Code返回1/0?
我们首先需要得到curl
输出 HTTP 状态。为此我使用了普凡登伯克的回答 https://superuser.com/a/442395/347295 to 让curl输出HTTP状态代码? https://superuser.com/q/272265/347295。接下来,我们必须将该输出放入环境变量中,以便我们可以测试它。为此,我们使用for /f %%a in ( 'command-to-execute' ) do ...
的形式for
命令(参见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
)
Notes:
我已经假设cmd
, val2
and val3
原始 URL 中的内容应该替换为早期环境变量的内容,因此已将它们更改为%cmd%
建造时等URL
.
In the for
语句,要执行的整个命令用单引号括起来('.....'
).
我将curl 的调用用双引号括起来("%SCRIPT_DIR%\curl"
):即使脚本目录包含空格,这也应该允许它工作。
我已经添加-s
(沉默)和-o nul
(将完整响应发送到哪里)到curl 的命令行。这将有助于确保从POST
请求不会干扰 HTTP 状态代码。如果您需要查看此输出,请使用-o filename
and TYPE
进行测试之前的文件HTTP
.
百分号登录-w "%%{http_code}"
需要加倍,因为它对 shell 有特殊意义。
的输出-v
(详细)发送至stderr
因此不应干扰捕获 HTTP 响应代码。
Update
要获取 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
The "delims="
意味着curl 的输出行不会被分割成单独的标记,因此%%a
将保留每一行的全部。
我已经删除了-s
and -o nul
选项,因此仍会生成curl 的原始输出。
The set "HTTP=%%a"
命令添加了双引号,以防止将尾随空格添加到环境变量中。因为响应代码(例如404)是curl发出的最后一行,所以最终值HTTP
仍然会是我们想要的。
The echo %%a
将重播由curl生成的所有行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)