Для примера выполняем запрос к docker registry, получаем список образов ( images ). RAD Studio CE 10.3 без дополнительных библиотек.
Запрос через curl. Ответ:
curl
http://1.1.1.1:5000/v2/_catalog{"repositories":["alpine","docker","nginx"]}
Unit1.cpp
ListBox1->Items->Clear(); //Чистим, будем выводить сюда репы
RESTClient1->ResetToDefaults();
RESTClient1->BaseURL = repoUrl; //Тут устанавливает путь к репозиторию:
http://1.1.1.1:5000/v2/ try {
//Для RESTRequest1->Resource устанавливаем _catalog
//Полный запрос получится
http://1.1.1.1:5000/v2/_catalog RESTRequest1->Execute(); //Выполняем запрос.
TJSONValue *jResponse = RESTResponse1->JSONValue; //Сам ответ
TJSONObject *JSON = (TJSONObject*)TJSONObject::ParseJSONValue(jResponse->ToString()); //Парсим его
TJSONPair *pair = JSON->Get("repositories"); //Получаем содержимое "массива" repositories
TJSONObject *jRepos = (TJSONObject*) pair->JsonValue; //В объект его и идём дальше
TJSONArray *jVal = (TJSONArray*)TJSONObject::ParseJSONValue(jRepos->ToString()); //Делаем из него массив, для дальнейшего обхода
int size = jRepos->Size(); //Кол-во репозиториев
for (int i = 0; i < size; ++i) {
TJSONValue* LItem = jVal->Get(i);
String repo = LItem->ToString(); //Имя образа, будет с кавычками. Далее удаляем их
repo.Delete(1,1);
repo.Delete(repo.Length(),1);
ListBox1->Items->Add(repo); //Добавляем в список
}
} catch (const Exception& e) {
MessageDlg("Exception: Нет подключения к репозиторию!", mtError, TMsgDlgButtons() << mbOK, 0);
}