У меня есть тестовая таблица с именем Cities
.Сценарий создания выглядит следующим образом:
ADD TABLE "Cities"
AREA "Schema Area"
LABEL "Cities"
DUMP-NAME "Cities"
ADD FIELD "ID" OF "Cities" AS integer
DESCRIPTION "ID"
INITIAL 0
LABEL "ID"
COLUMN-LABEL "ID"
ORDER 10
ADD FIELD "City" OF "Cities" AS character
DESCRIPTION "City name"
FORMAT "x(30)"
INITIAL ""
LABEL "Cities"
MAX-WIDTH 30
COLUMN-LABEL "Cities"
ORDER 20
ADD INDEX "IxID" ON "Cities"
AREA "Schema Area"
UNIQUE
PRIMARY
INDEX-FIELD "ID" ASCENDING
.
PSC
cpstream=1250
.
0002253205
Я добавил одну запись в эту таблицу:
create Cities.
assign
Cities.ID = 1
Cities.City = "Boston".
FOR EACH
Процедура показывает правильный результат с одной записью.
Я создал REST-проект с классическими настройками сервера для обучения и тестирования.Все серверы и конфигурации являются стандартными, как их установщик настроил.Я добавил некоторые процедуры в папку AppServer (file: test.p) и создал в ней временную таблицу.Полный код процедуры:
BLOCK-LEVEL ON ERROR UNDO, THROW.
DEFINE TEMP-TABLE ttCities LIKE Cities.
@openapi.openedge.export(type="REST", useReturnValue="false", writeDataSetBeforeImage="false").
PROCEDURE readCities:
DEFINE OUTPUT PARAMETER TABLE FOR ttCities.
FOR EACH Cities NO-LOCK:
CREATE ttCities.
BUFFER-COPY Cities TO ttCities.
END.
END PROCEDURE.
@openapi.openedge.export(type="REST", useReturnValue="false", writeDataSetBeforeImage="false").
PROCEDURE putCities:
DEFINE INPUT-OUTPUT PARAMETER TABLE FOR ttCities.
END PROCEDURE.
Процедура хорошо компилируется, аннотации добавляются функциональностью Define Service Interface
в OpenEdge.В узле Defined Services
я создал сопоставления для параметров (я опущу readCities
, потому что он хорошо работает) для putCities
и глагола PUT:
- Ресурсы:
/PutCities
- Ассоциация глаголов:
Verb='PUT'
-> test..putCities - Отображение определений для ввода: параметр ttCities связан с секцией запроса
HTTP Message -> Body
напрямую (не с параметром тела) - Определения сопоставления дляВывод: ответ ttCities подключен к
Interface Parameters -> ttCities
Мой клиентский код очень прост - взят из некоторой статьи в Progress KB, и в проекте есть OpenEdge.Net.pl
библиотеки, включенные в PROPATH:
BLOCK-LEVEL ON ERROR UNDO, THROW.
USING Progress.Json.ObjectModel.JsonObject.
USING Progress.Json.ObjectModel.*.
USING Progress.Json.ObjectModel.ObjectModelParser.
USING Progress.Lang.Object.
USING OpenEdge.Core.WidgetHandle.
USING OpenEdge.Core.String.
USING OpenEdge.Net.HTTP.IHttpRequest.
USING OpenEdge.Net.HTTP.IHttpResponse.
USING OpenEdge.Net.HTTP.ClientBuilder.
USING OpenEdge.Net.HTTP.RequestBuilder.
DEFINE VARIABLE oRequest AS IHttpRequest NO-UNDO.
DEFINE VARIABLE oResponse AS IHttpResponse NO-UNDO.
DEFINE VARIABLE oEntity AS Object NO-UNDO.
DEFINE VARIABLE lcHTML AS LONGCHAR NO-UNDO.
DEFINE VARIABLE hXmlDoc AS HANDLE NO-UNDO.
DEFINE VARIABLE hCities AS HANDLE NO-UNDO.
DEFINE VARIABLE oJson AS JsonObject NO-UNDO.
DEFINE VARIABLE lReturnValue AS LOGICAL NO-UNDO.
DEFINE TEMP-TABLE ttCities LIKE Cities.
hCities = TEMP-TABLE ttCities:HANDLE.
create ttCities.
assign
ttCities.ID = 1
ttCities.City = "Boston".
oJson = NEW JsonObject().
lReturnValue = oJson:Read(hCities).
oRequest = RequestBuilder:Put('http://127.0.0.1:8980/REST6/rest/REST6/PutCities', oJson):Request.
oResponse = ClientBuilder:Build():Client:Execute(oRequest).
MESSAGE oResponse:StatusCode oResponse:StatusReason VIEW-AS ALERT-BOX.
/* some other code to parse response */
Этот код хорошо компилируется, но при его вызове выдается эта ошибка: Cities already exists with ID 1.
Я полагаю, что процедура вызывается на сервере, но не может обновить запись в БД из-за этой ошибки.Насколько я знаю, вызов метода PUT должен выполнять обновление записи, а не создавать новую.Кроме того, изменение ttCities.ID
на значение 2 создает новую запись.
Так что мой вопрос прост: как с этим справиться?Должен ли я написать свою собственную логику в процедуре putCities
?
Любая помощь будет оценена.