批量循环遍历变量并发送 API 请求

Batch to loop through variables and send API request

我在使用 Windows 中的命令行从 API 中获取一些数据时遇到了问题。基本上,这就是我想要做的:

1- 从 API(使用 curl 和 jq)获取客户端列表,
2- 将此列表保存在.txt 中(我想将其保存在变量中但没有管理),
3- 遍历 .txt 中的客户端列表并发送新的 API 请求下载特定于此客户端的 csv

前 2 个步骤工作正常,但我卡在最后一点循环遍历客户端。
这是我的代码:

setlocal ENABLEDELAYEDEXPANSION

Set tok=XXXXX
Set hURL="https://api.website.com/v2/clients?token=%tok%"
Set IDPath="C:\Users\My Self\subIDs.txt"
Set cuPath=%~dp0

del %IDPath%

curl -sS %hURL% | jq ".clients[].id" > %idPath%

FOR /F %%i in (%IDPath%) do (
    echo %%i
    Set subID=%%i
    Set rURL="https://api.website.com/v2/data?token=%tok%&subscriptionId=!subID!"
    curl -sS -o cuPath!subID!.csv !rURL!
)   

endlocal
pause

我觉得奇怪的地方:
- echo %%i returns: C:\Users\My
看起来路径中的 space 是这个循环的问题,但它没有导致保存文件的任何问题,所以我有点迷路
- 我正在使用 !subID! 因为我知道这是每次调整变量的唯一方法但是在查看 !rURL![=33 的输出时=] 变量,而 %tok% 作为 XXXXX 成功传递,!subID! 保持为 !subID!
- 当然,我终于得到了一个 curl:(6) Could not resolve host: rURL

我对 APIs、批处理或 JSON 完全陌生,尽管我觉得我越来越接近了,但我现在仍然停留在最后一点。知道如何解决这个问题吗? 谢谢,

您的代码中存在一些错误,已在以下代码中修复。

但是由于您没有指定 jq ".clients[].id" 返回的确切格式,我只能猜测它 returns 是一个单个标记,字符之间没有任何空格,但它可能有前导或尾随空格。

因此,如果不是这种情况,您必须相应地设置 FOR /F 选项。

@echo off    
setlocal DisableDelayedExpansion

Set "tok=XXXXX"
Set "hURL=https://api.website.com/v2/clients?token=%tok%"
Set "rURL=https://api.website.com/v2/data?token=%tok%&subscriptionId="
Set "IDPath=C:\Users\My Self\subIDs.txt"

:: No need to delete %IDPath%, It will be overwrriten by the below redirection
curl -sS "%hURL%" | jq ".clients[].id" > "%IDPath%"

FOR /F "usebackq" %%i in ("%IDPath%") do (
    echo subID=%%i
    curl -sS -o "%~dp0%%i.csv" "%rURL%%%i"
) 

REM del "%IDPath%"

endlocal
pause

几点:

  • 您已经为变量分配了在其值中嵌入引号的变量,虽然这在您的特定情况下有效,但最好不要在变量值中嵌入引号,所以不要 Set hURL="https://..." 使用 Set "hURL=https://..." 并且您可以稍后在实际使用它们时将变量括在引号中:"%hURL%"

    想想你想要访问不带引号的值的情况,如果你通过 set a="value" 分配值,你必须编写额外的代码来从值中删除引号。但是通过 set "a=value" 您可以同时访问引用 ("%a%" ) 和未引用 (%a%) 的值。

  • 你使用了不带引号的Set cuPath=%~dp0,它应该是Set "cuPath=%~dp0",但也不需要,你可以直接在循环中使用%~dp0

    后来您在 FOR 循环中使用了 cuPath,但没有展开它,也没有用引号将 cURL 输出文件括起来。

  • 当通过 FOR /F 读取文件内容时,如果到的路径被引号括起来,那么您必须使用 UseBackq 选项来更改引号的解释FORIN 子句不将其解释为文字字符串。

  • 根据您的情况,完全不需要延迟扩展。

    但是作为旁注,您在使用延迟扩展时必须更加小心。启用延迟扩展后,您可能在代码中使用的任何文字字符串(包括文件和 url 路径)如果包含 ! 字符,都将被损坏。

    所以最好在延迟扩展关闭时设置所需的变量和字符串,然后在延迟扩展启用时通过 !var! 语法访问它们。