Задание 4: Отправка данных
Теперь добавим код для обновления свойств конфигурации сервера приложений с помощью метода PUT.
Использование метода PUT очень похоже на использование метода GET. Отличие в том, что с методом GET мы не передаём какую-то дополнительную нагрузку, но при использовании PUT мы должны отправить на сервер некоторую информацию.
- Перейдите на форму и щёлкните два раза по кнопке Upd Prop. Автоматически будет создан метод UpdPropBtn_Click, который будет срабатывать на событие щелчка мышью по кнопке. В тело этого метода добавим код для изменения конфигурации сервера приложений.
- В первую очередь создадим экземпляр IHttpClient
oClient = ClientBuilder:Build():Client.
- Далее создадим экземпляр Credentials и URI
oCredentials = new Credentials('Tomcat Manager Application','tomcat', 'tomcat'). oURI = new URI('http','localhost',8810). oURI:Path = '/oemanager/applications/oepas1/properties/'.
- Затем создадим строку для передачи в текстовом формате JSON.
payLoadInput = "~{~"minAgents~":~"" + string(minAgents:value) + "~"~, ~"maxAgents~":~"" + string(maxAgents:value) + "~"~,~"numInitialAgents~":~"" + string(numInitialAgents:value) + "~"~,~"maxConnectionsPerAgent~":~"" + string(maxConnectionsPerAgent:value) + "~"~,~"maxABLSessionsPerAgent~":~"" + string(maxConnectionsPerAgent:value) + "~"~,~"agentStartLimit~":~"" + string(agentStartLimit:value) + "~"~}".
- Далее создадим экземпляр ObjectModelParser и затем типизируем строку для передачи в объект.
oParser = new ObjectModelParser(). myPayLoad = cast(oParser:Parse(payLoadInput), object).
- Создадим запрос используя oURI, myPayLoad и oCredentials
oRequest = RequestBuilder :put(oURI, myPayLoad) :ContentType('application/vnd.progress+json') :UsingBasicAuthentication(oCredentials) :Request.
Обратите внимание, что метод ContentType используется для указания типа содержимого как application/vnd.progress+json. Напомним, что этот метод необходим чтобы указать тип поддерживаемого сервером запроса. Таким образом передаваемая строка будет конвертирована в application/vnd.progress+json и отправлена на сервер для исполнения.
- Добавляем код для выполнения запроса.
oResponse = ResponseBuilder:Build():Response. oClient:Execute(oRequest, oResponse).
- Извлекаем данные из ответа и сохраняем в файл.
oResponseEntity = oResponse:Entity. if type-of(oResponseEntity, JsonObject) then cast(oResponseEntity, JsonObject):WriteFile(session:temp-dir + 'put' + 'entity.json', true). else lcEntityHTML = oEntity:ToString(). /* Изменяем расширение файла в зависимости от типа ContentType */ case oResponse:ContentType: when 'application/json' then copy-lob lcEntityHTML to file session:temp-directory + 'put' + 'entity.json' no-convert. when 'text/html' then copy-lob lcEntityHTML to file session:temp-directory + 'put' + 'entity.html' no-convert. otherwise copy-lob lcEntityHTML to file session:temp-directory + 'put' + 'entity.txt' no-convert. end case.
- Сохраните изменения.

- Выполните код Run > Run As > Progress OpenEdge Application.
- Щёлкните по кнопке Get Prop для получения свойств сервера приложений.

- Измените какие-нибудь параметры, например, максимальное количество агентов при старте или максимальное количество ABL-сессий на агенте. Щёлкните по кнопке Upd Prop.

- Чтобы проверить правильность обновления обнулите все значения из полей формы и нажмите на кнопку Get Prop.


Вы должны увидеть, что изменённые вами значения правильно были возвращены с сервера приложений.
Примечание: значения ваших свойств могут отличаться.
Если во время выполнения возникли какие-то ошибки, то внимательно просмотрите свой код и сравните его с кодом тренинга. Если у вас всё ещё остались вопросы, или вы не смогли устранить ошибку, то напишите об этом внизу страницы в виде комментария.
Есть вопрос? Спросите...
Для отправки комментария вам необходимо авторизоваться.
1 Комментарий
Код содержит ошибку:
if type-of(oResponseEntity, JsonObject) then
cast(oResponseEntity, JsonObject):WriteFile(session:temp-dir + ‘put’ + ‘entity.json’, true).
else
lcEntityHTML = oEntity:ToString().
в случае не JsonObect-а, lcEntityHTML – пытается получить значение от неинициализированной переменной oEntity.
Далее:
CASE oResponse:ContentType:
WHEN ‘application/json’ THEN
COPY-LOB lcEntityHTML TO FILE SESSION:TEMP-DIRECTORY + ‘put’ + ‘entity.json’ NO-CONVERT.
WHEN ‘text/html’ THEN
COPY-LOB lcEntityHTML TO FILE SESSION:TEMP-DIRECTORY + ‘put’ + ‘entity.html’ NO-CONVERT.
OTHERWISE
COPY-LOB lcEntityHTML TO FILE SESSION:TEMP-DIRECTORY + ‘put’ + ‘entity.txt’ NO-CONVERT.
END CASE.
oResponse:ContentType возвращается с таким значением “application/vnd.progress+json”, соответственно
в CASE отрабатывает OTHERWISE, в котором выводится пустое значение неинициализированной переменной lcEntityHTML