Пакетная обработка переменных и отправка запроса API - PullRequest
0 голосов
/ 12 сентября 2018

Я столкнулся с проблемой получения некоторых данных из API с помощью командной строки в Windows. По сути, это то, что я хочу сделать:

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 возвращает: C: \ Users \ My
Похоже, что пространство в пути является проблемой для этого цикла, но это не вызвало проблем с сохранением файла, поэтому я немного растерялся
- Я использую ! SubID! , так как я понимаю, что это единственный способ корректировать переменную каждый раз, однако, глядя на вывод переменной ! RURL! , тогда как % tok% успешно передается как XXXXX, ! subID! остается как! subID!
- Я, наконец, получаю, конечно, завиток: (6) Не удалось разрешить хост: rURL

Я совершенно новичок в API, пакетном режиме или JSON, и хотя я чувствую, что становлюсь ближе, я застрял на этом последнем кусочке. Есть идеи, как это решить? Спасибо,

1 Ответ

0 голосов
/ 12 сентября 2018

В вашем коде были некоторые ошибки, исправленные в следующем коде.

Но так как вы не указали точный формат, возвращаемый 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

Некоторыеpoints:

  • Вы назначили переменные со встроенными окружающими кавычками в их значениях, в то время как это будет работать в вашем конкретном случае. Рекомендуется не встраивать кавычки в значения переменных,Таким образом, вместо 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!, если включено отложенное расширение.

...