以前のブログ記事で、 ORDAクラスと、それが提供するコーディングをより円滑にする可能性について学びました。今回のブログでは、RESTサーバでの使用方法について説明します。
実際に見てみましょう
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
$objnumberOfStudents$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
etc…。
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 .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以降、関数はデフォルトで公開されていません。公開したい関数をマークするのを忘れないでください。