ORDAデータモデルクラスとREST

Deeplからの自動翻訳

以前のブログ記事で、 ORDAクラスと、それが提供するコーディングをより円滑にする可能性について学びました。今回のブログでは、RESTサーバでの使用方法について説明します。

実際に見てみましょう

HDI:RESTサーバでのORDAクラスの使用例

LearningSystemというデータベースがあり、以下のテーブルを含んでいます。

このデータベースはRESTサーバとしてlocalhost (ポート8044)で公開されています。このデータベースはRESTサーバとしてlocalhost (port 8044)に公開されており、そのクラスで定義されたすべての関数はRESTリクエストのPOST操作で呼び出すことができます。

データストア・クラスで定義された関数の呼び出し

データストアのオブジェクトは、/rest/$catalogという接頭辞を使って取得します。

DataStoreデータストア・クラスには、getStatistics() 関数が定義されています。この関数は、学校に関する情報を持つコレクションを返します。

Class extends DataStoreImplementation

Function getStatistics

C_COLLECTION
New object()
( ; ) ( ; ) := ( ; . . ) := . := . . := . . . := . . $0$result
C_OBJECT$obj$school

$resultNew collection()


For each$schoolThisSchoolsall() $obj $objname$schoolname
$objcity$schoolcityname
$obj
numberOfStudents$schoolstudentslength

$result .( ) push$obj
End for each

$0:=。$result

http://127.0.0.1:8044/rest/$catalog/getStatisticsのURLで呼び出すことができます。

以下は、サーバーからの応答です。

{
"result":[
{
"name":"オールドスクール",
"都市":"Solebury",
"numberOfStudents":3
},
{
"name":"History Institute",
"city":"Solebury",
"numberOfStudents":3
},
{
"name":"4D University",
"city":"Hummelstown",
"numberOfStudents":3
}.
]
}
.

データクラスで定義された関数の呼び出し

データクラスオブジェクトは、/rest/dataClassNameというプレフィックスでアクセスします。

registerStudent() 関数がSchoolsデータクラスで定義されています。この関数は、生徒のデータをオブジェクトで受け取り、生徒の英語レベルが学校の要求レベルを満たしているかどうかをチェックします。英語レベルに問題がなければ、この関数はStudentsエンティティを作成し、保存します。

Class extends DataClass

Function registerStudent

C_OBJECT($1;$data;$student;$school;$result;$0)

$data :=$1

$school :=ds.Schools.query("name = :1";$data.schoolName).first()
$result
:=New object("success";True)

If ($data.englishLevel <$school.minAcceptedEnglishLevel)
$result success :=False $result statusText :="The english level is not enough"
$0 :=$result
End if

If ($result.success)
$student :=ds.Students.new()
$student .
etc…。fromObject($data)
$student .finalExam:=「とる」
$student .school:=$school

$result :=$student.save()

$0 :=。$student
End if

http://127.0.0.1:8044/rest/Schools/registerStudentの URL からアクセスできます。

パラメータはコレクションとして、リクエストのボディに渡す必要があります。

[
{
"firstname":"Mary",
"lastname":"Smith",
"englishLevel":2,
"schoolName":"Math school"
}
]

以下は、サーバーからの応答です。

{
"__entityModel":"学生",
"__DATACLASS":"Students"、
"__KEY":"9",
"__timestamp":"2020-06-03T13:08:13.542z",
"__stamp":1、
"ID"。9、
"firstname"。"Mary",
"lastname":"Smith",
"englishLevel":2、
"schoolID"。4、
"finalExam"。"To take",
"school": {
"__deferred":{
"uri":"/rest/Schools(4)",
"__KEY":"4"
}
}
}

エンティティクラスで定義された関数を呼び出す

エンティティオブジェクトは、/rest/dataClassName(key)というプレフィックスでアクセスします。keyはエンティティのプライマリキーです。

StudentsEntityエンティティクラスには、studyingInSameCity() 関数が定義されています。これは、現在のStudentと同じ都市で勉強している他のすべての学生を返します。

Class extends Entity

Function studyingInSameCity
C_OBJECT($0;$city)

$city :=This.school.city
$0 :=$city.schools.students.
minus (This)

この例は、主キーが7のエンティティの場合です。このエンティティには、http://127.0.0.1:8044/rest/Students(7)/studyingInSameCity/?$attributes=firstname, lastnameというURLでアクセスしています。

このエンティティに studyingInSameCity() 関数を適用し、返された属性をフィルタリングしてfirstnameとlastnameだけを取得します(/?$attributes=firstname, lastname)。

以下はサーバーからの応答です。

{
"__dataclass":"Students",
"__entityModel":"Students",
"__GlobalStamp":0、
"__COUNT":3、
"__FIRST"。0、
"__entities"。[
{
"__KEY":"5",
"__timestamp":"2020-06-16T13:59:51.095z",
"__stamp":1、
"firstname":"Ricky",
"lastname":"Coyle"
},
{
"__KEY":"6",
"__timestamp":"2020-06-16T13:59:51.095z",
"__stamp":1、
"firstname":"アロンゾ",
"ラストネーム":"サパタ"
}
],
"__SENT":3
}
.

エンティティ選択クラスで定義された関数を呼び出す

エンティティ選択オブジェクトには、フィルタ構文でアクセスすることができます。例えば、/?$filter=”finalExam=’To take'” とすると、finalExam 属性の値が “To take” であるすべての学生を取得することができます。

エンティティセレクションは他の方法でアクセスすることもできますので、必ずドキュメントを確認してください。

StudentsSelectionエンティティ選択クラスには、setFinalExam() 関数が定義されています。これは、各生徒のfinalExam 属性を与えられた値で更新します。

Class extends EntitySelection

Function setFinalExam

C_TEXT($1;$value)
C_OBJECT ($student;$status;$0)

$value :=$1


For each ($student;This)Until (Not($status.success) )
$studentfinalExam:= := . :=$status$value
$status$studentsave()
End for each

$0

この例では、http://127.0.0.1:8044/rest/Students/setFinalExam/?$filter=”finalExam=’To take'”からアクセス可能です。というURLでアクセスしています。

以下はリクエストの本文です。

[
"合格"
]

これがサーバーからの応答です (該当する生徒はすべて適切に更新されています)。

{
"result":{
"success": true
}
}.

HDIをダウンロードして、上記をすべて実際に見てみましょう。

注意
キーワードについては、この投稿を必ずチェックしてください。4D v18 R5以降、関数はデフォルトで公開されていません。公開したい関数をマークするのを忘れないでください。

Avatar
- プロダクトオーナー - Marie-Sophie Landrieu-Yvertは、2017年にプロダクトオーナーとして4Dプロダクトチームに参加しました。プロダクトオーナーとして、彼女はユーザーストーリー(ユーザーが期待する新機能とその使用法)を書き、それを具体的な機能仕様に変換する役割を担っています。また彼女の役割は、実装された機能が顧客のニーズを満たしているかどうかを確認することでもあります。彼女は1995年にESIGELEC Engineering Schoolを卒業し、IBMでエンジニアとしてのキャリアをスタートさせました。様々なプロジェクト(保守や新規のプロジェクト)に参加し、Cobolのデベロッパーとして働きました。その後、UMLデザイナーおよびJavaデベロッパーとして勤務。最近は、機能要件の分析・記述、ビジネスチームと開発チームの調整などを主に担当しています。