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

标签 http batch-file curl return-value httpresponse

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

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

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

工具:解析返回值

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 Code返回1/0?

最佳答案

我们首先需要获取curl 来输出HTTP 状态。为此,我使用了 pvandenberk's answerGetting curl to output HTTP status code? .接下来,我们必须将该输出放入一个环境变量中,以便我们可以对其进行测试。为此,我们使用 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
)

注意事项:

  • 我假设您原始 URL 中的 cmdval2val3 应该替换为较早的环境变量,因此在构建 URL 时已将它们更改为 %cmd% 等。

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

  • 我用双引号 ("%SCRIPT_DIR%\curl") 包裹了 curl 的调用:即使脚本目录包含空格。

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

  • -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 - 如何使用从批处理脚本调用的 curl 获取 http post 请求的响应代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59386902/

相关文章:

html - Adobe FDF(PDF 表单)提交按钮 - 到另一个框架?

c - 我自己写了一个http服务器,我想通过这个服务器执行一个cgi脚本。但我不知道该怎么做

windows - %* 在批处理文件中是什么意思?

windows - 在 Windows 批处理文件中执行时脚本挂起

javascript - 我想使用 HTML Get 更改 iframe 源

ubuntu - 当我不知道显式链接时如何通过终端下载文件?

java - 知道为什么这个请求在curl 中有效而不是在java 中吗?

android - AngularJS HTTP 状态 -1

javascript - AngularJS 工厂、服务和 HTTP 使用

windows - 简单的Bat文件,Windows找不到 'nameofthefile'