首页 > 解决方案 > 批量循环变量并发送 API 请求

问题描述

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

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

前两个步骤工作正常,但我被困在最后一位循环客户端。
这是我的代码:

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 返回:C:\Users\My
看起来路径中的空间是这个循环的问题,但它不会导致保存文件的任何问题,所以我我有点迷路
- 我正在使用!subID!据我了解,这是每次调整变量的唯一方法,但是在查看!rURL 的输出时!变量,而%tok%作为 XXXXX 成功传递,!subID! 仍为 !subID!
- 我终于得到了,当然,卷曲:(6)无法解析主机:rURL

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

标签: batch-filecurlcmdwindows-console

解决方案


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

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

因此,如果不是这种情况,您必须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直接在循环中使用。

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

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

  • 根据您所做的,根本不需要延迟扩展。

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

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


推荐阅读