在传统的服务器进展REST PUT返回错误

问题描述 投票:2回答:1

我有一个测试表叫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程序显示了一个记录正确的结果。

我已创建了学习和测试目的经典服务器设置一些休息的项目。所有服务器和配置作为标准配置installator他们。我增加了一些程序,应用服务器的文件夹(文件: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.

程序编译井,注释是由在OpenEdge Define Service Interface功能加入。在Defined Services节点,我创建映射参数(我将省略readCities,因为它工作得很好)为putCities和PUT动词:

  1. 资源:/PutCities
  2. 动词协会:Verb='PUT' - > test..putCities
  3. 对于输入映射说明:参数ttCities被连接到直接请求HTTP Message -> Body部(未身体参数)
  4. 对于输出映射定义:响应ttCities连接到Interface Parameters -> ttCities

我的客户端代码是非常基本的 - 一些进展知识库文章采取和项目有包括在PROPATH OpenEdge.Net.pl库:

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程序?

任何帮助将不胜感激。

rest web-services put openedge progress-4gl
1个回答
1
投票

我认为这个问题如下:

您创建临时表“喜欢”你的数据库表,所以它继承了唯一索引,以及“城市”的表格友好名称。您ReadCities会为每个数据库记录临时表中的记录,所以我们有一个为1的ID。

你的客户端代码,虽然,创建ID为1的临时表的记录,但随后掉头的ReadCities代码,并得到所有的数据库记录,并在这一点上你的错误是已经有一个临时表记录有与的1的ID。

您可以通过将邮件在你的代码,以确定在收到什么时候该错误可能证明这一点。我想,如果你把一个消息之前“lReturnValue = oJson:读(hCities)”另有后,你会得到错误之前的第一条消息。

© www.soinside.com 2019 - 2024. All rights reserved.