Задание 3: Извлечение данных
Теперь вы добавите код для получения свойств конфигурации, используя RESST-метод GET, и заполнить форму.
- Щёлкните правой кнопкой мыши в любом месте формы и выберите пункт меню View Source или нажмите клавишу F9.
- Добавим операторы using, для включения в код необходимых классов. Для этого в верхней части кода, сразу за существующими операторами USING добавьте следующие:
using OpenEdge.Net.HTTP.*. using OpenEdge.Net.*. using Progress.Json.ObjectModel.*. using OpenEdge.Core.*.
- Теперь добавьте необходимые переменные. Для этого перейдите внутрь класса Form1 и сразу после описания последней переменной перед конструктором формы, добавьте следующие переменные:
define private variable oClient as iHttpClient no-undo. define private variable oRequest as iHttpRequest no-undo. define private variable oResponse as iHttpResponse no-undo. define private variable oURI as URI no-undo. define private variable oEntity as object no-undo. define private variable oCredentials as Credentials no-undo. define variable jsonFile as longchar no-undo. define variable myParser as ObjectModelParser no-undo. define variable myJsonObject as JsonObject no-undo. define variable jsonNames as character extent no-undo. define variable jsonSubNames as character extent no-undo. define variable jsonSubElements as JsonObject no-undo. define variable cMinAgents as character no-undo. define variable cMaxAgents as character no-undo. define variable cNumInitialAgents as character no-undo. define variable cMaxConnectionsPerAgent as character no-undo. define variable cMaxABLSessionsPerAgent as character no-undo. define variable cAgentStartLimit as character no-undo. define variable payLoadInput as character no-undo. define variable myPayLoad as object no-undo. define variable oParser as objectModelParser no-undo. define variable iNumCookies as integer no-undo. define variable oCookies as Cookie extent no-undo. define variable oResponseEntity as object no-undo. define variable lcEntityHtml as longchar no-undo.
- Сохраните изменения и перейдите к форме.
- Щёлкните два раза по кнопке Get Prop. Автоматически будет создан метод GetPropBtn_Click, который будет срабатывать на событие щелчка мышью по кнопке.
- В тело этого метода вы добавите код сначала код для создания клиента oClient используя метод Build() и свойства Client класса ClientBuilder. Мы также используем метод KeepCookies() для включения cookie для нашего клиента.
Добавьте следующий код перед оператором return:
oClient = ClientBuilder:Build():KeepCookies(CookieJarBuilder:Build():CookieJar):Client.
- Далее добавим код для создания URI (oURI) и укажем путь к ресурсу:
oURI = new URI('http','localhost',8810). oURI:Path = '/oemanager/applications/oepas1/properties/'.
- Теперь добавим объект для учётных данных, oCredentials.
oCredentials = new Credentials('Tomcat Manager Application','tomcat', 'tomcat').
- Создадим запрос oRequest с помощью метода Build() и свойства Request класса RequestBuilder.
REST-сервис, к которому мы будем подключаться, поддерживает базовую аутентификацию. Поэтому мы используем метод usingBasicAithentication() для указания типа аутентификации и передачи учётных данных для доступа к сервису.
oRequest = RequestBuilder:Build('GET', oURI):usingBasicAuthentication(oCredentials):Request.
- Добавим код для создания объекта ответа и выполнения запроса.
oResponse = ResponseBuilder:Build():Response. oClient:Execute(oRequest, oResponse).
- Мы используем данные из ответа для заполнения элементов формы. Но перд этим нам необходимо убедиться в том, что транзакция завершилась успешно:
if oResponse:StatusCode <> 200 then do: return error 'Request error: ' + string(oResponse:StatusCode). end. else cast(oResponse:Entity, JsonObject):WriteFile('testGUI.json', true).
Здесь мы проверяем код возврата. Если код возврата 200, то транзакция завершилась успешно. Для PAS for OpenEdge возможные коды возврата 200, 404 и 500. Однако, когда вы будете работать с другими REST-сервисами, вам будет необходимо реализовать обработку других, отличных от 200, кодов возврата, которые тоже могут означать успешность транзакции.
Если транзакция завершилась успешно, то мы извлекаем полученные данные и записываем их в файл. Эти данные будут доступны с помощью свойства Entity. Однако, поскольку данные передаются в виде объекта, мы должны выполнить типизировать их в JsonObject перед записью в файл.
- Теперь добавим код для извлечения данных из файла
copy-lob from file "testGUI.json" to jsonFile convert target codepage "utf-8".
- Перед заполнением полей выполним разбор содержимого JSON-файла.
myParser = new ObjectModelParser(). myJsonObject = cast(myParser:Parse(jsonFile), JsonObject). jsonNames = myJsonObject:getNames(). jsonSubElements = myJsonObject:getJsonObject("result"). jsonSubNames = jsonSubElements:getNames().
- Извлечём необходимые значения и сохраним в соответствующие переменные.
cMinAgents = jsonSubElements:getcharacter("minAgents"). cMaxAgents = jsonSubElements:getcharacter ("maxAgents"). cNumInitialAgents = jsonSubElements:getcharacter ("numInitialAgents"). cMaxConnectionsPerAgent = jsonSubElements:getcharacter ("maxConnectionsPerAgent"). cMaxABLSessionsPerAgent = jsonSubElements:getcharacter ("maxABLSessionsPerAgent"). cAgentStartLimit = jsonSubElements:getcharacter ("agentStartLimit").
- Заполним поля формы
minAgents:value = INT(cMinAgents). maxAgents:value = INT(cMaxAgents). numInitialAgents:value = INT(cNumInitialAgents). maxConnectionsPerAgent:value = INT(cMaxConnectionsPerAgent). maxABLSessionsPerAgent:value = INT(cMaxABLSessionsPerAgent). agentStartLimit:value = INT(cAgentStartLimit).
- Сохраните изменения.
- Выполните код Run > Run As > Progress OpenEdge Application.
- Щёлкните по кнопке Get Prop. Все поля формы должны заполниться.
Примечание: ваши значения полей могут отличаться.
Если во время выполнения возникли какие-то ошибки, то внимательно просмотрите свой код и сравните его с кодом тренинга. Если у вас всё ещё остались вопросы, или вы не смогли устранить ошибку, то напишите об этом внизу страницы в виде комментария.