Třídy datového modelu ORDA a REST

Automaticky přeloženo z Deepl

V předchozím příspěvku na blogu jste se dozvěděli o třídách ORDA a možnostech, které nabízejí pro usnadnění kódování. V tomto blogovém příspěvku se dozvíte, jak je používat se serverem REST.

Podívejme se na to v akci!

HDI: Příklady použití tříd ORDA se serverem REST

Máme databázi s názvem LearningSystem, která obsahuje následující tabulky:

Tato databáze je vystavena jako server REST na localhostu (port 8044). Všechny funkce definované v jejích třídách lze volat pomocí požadavků REST v operaci POST.

Volání funkce definované ve třídě datového úložiště

Objekt datového skladu se načte pomocí předpony /rest/$catalog.

Ve třídě datového skladu DataStore byla definována funkce getStatistics(). Funkce vrací kolekci s informacemi o školách.

Class extends DataStoreImplementation

Function getStatistics

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

$resultNew collection()


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

$result . ( ) push$obj
End for each

$0:=$result

Můžete jej zavolat pomocí adresy URL http://127.0.0.1:8044/rest/$catalog/getStatistics.

Zde je odpověď ze serveru:

{
"result": [
{
"name": "Old school",
"city": "Solebury",
"numberOfStudents": 3
},
{
"name": "History Institute",
"city": "Solebury",
"numberOfStudents": 3
},
{
"name": "4D University",
"city": "Hummelstown",
"numberOfStudents": 3
}
]
}

Volání funkce definované ve třídě datové třídy

K objektu datové třídy se přistupuje prostřednictvím předpony /rest/dataClassName.

Ve třídě datové třídy Schools byla definována funkce registerStudent(). Funkce přijímá data studenta v objektu a kontroluje, zda úroveň angličtiny studenta splňuje úroveň požadovanou školou. Pokud je jeho úroveň angličtiny v pořádku, funkce vytvoří a uloží entitu 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("úspěch";True)

If ($data.englishLevel < $school.minAcceptedEnglishLevel)
$result .success:=False
$result .statusText:="Úroveň angličtiny nestačí"
$0 :=$result
End if

If ($result.success)
$student :=ds.Students.new()

$student .fromObject($data)
$student .finalExam:="Vzít"
$student .school:=$school
$result :=$student.save()

$0 :=$student
End if

Je přístupná prostřednictvím adresy URL http://127.0.0.1:8044/rest/Schools/registerStudent.

Parametry musí být předány jako kolekce, v těle požadavku:

[
{
"jméno": "Mary",
"příjmení
„:"Smith",
"englishLevel": 2,
"schoolName": "Math school"
}
]

Zde je odpověď ze serveru:

{
"__entityModel": "Students",
"__DATACLASS": "Students",
"__KEY": "9",
"__TIMESTAMP": "2020-06-03T13:08:13.542Z",
"__STAMP": 1,
"ID": 9,
"firstname": "Mary",
"lastname": "jméno
„:"Smith",
"englishLevel": 2,
"schoolID": 4,
"finalExam": "To take",
"school": {
"__deferred": {
"uri": "/rest/Schools(4)",
"__KEY": "4"
}
}
}

Volání funkce definované ve třídě entit

K objektu entity se přistupuje prostřednictvím předpony /rest/dataClassName(key ), kde klíč je primární klíč entity.

Ve třídě entity StudentsEntity byla definována funkce studyingInSameCity(). Vrací všechny ostatní studenty studující ve stejném městě jako aktuální Student.

Class extends Entity

Function studyingInSameCity
C_OBJECT($0;$city)

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

Tento příklad se týká entity s primárním klíčem = 7. Přístup k ní je možný prostřednictvím adresy URL http://127.0.0.1:8044/rest/Students(7)/studyingInSameCity/?$attributes=firstname, lastname.

Aplikujeme studyingInSameCity() funkci na tuto entitu a filtrujeme vrácené atributy, abychom získali pouze jméno a příjmení (/?$attributes=jméno, příjmení).

Zde je odpověď ze serveru:

{
"__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": "Ricky", "Coyle" "__KEY": "6",
"__TIMESTAMP": "2020-06-16T13:59:51.095Z",
"__STAMP": 1,
"firstname": "Alonzo",
"lastname": "Zapata"
}
],
"__SENT": 3
}

Volání funkce definované ve třídě pro výběr entit

K objektu výběru entit lze přistupovat pomocí syntaxe filtru. Například /?$filter=“finalExam=’To take'“ pro získání všech studentů s hodnotou „To take“ pro atribut finalExam.

K výběru entit lze přistupovat i jinými způsoby, takže se nezapomeňte podívat do dokumentace.

Ve třídě pro výběr entit StudentsSelection byla definována funkce setFinalExam(). Ta aktualizuje atribut finalExam každého studenta zadanou hodnotou.

Class extends EntitySelection

Function setFinalExam

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

$value :=$1


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

$0 :=$status

V tomto příkladu je přístupný přes http://127.0.0.1:8044/rest/Students/setFinalExam/?$filter=“finalExam=’To take'“. URL.

Zde je tělo požadavku:


] [
"Prošlo" ]

Zde je odpověď serveru (všichni dotyční studenti byli řádně aktualizováni):

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

Stáhněte si HDI, abyste viděli vše výše uvedené v akci.

Poznámka:
Nezapomeňte se podívat na tento příspěvek o klíčových slovech. Od verze 4D v18 R5 nejsou funkce ve výchozím nastavení vystaveny. Nezapomeňte označit funkce, které chcete vystavit!

Avatar
• Product Owner • Marie-Sophie Landrieu-Yvert se připojila k programovému týmu 4D jako Product Owner v roce 2017. Jako Product Owner má na starosti psaní uživatelských příběhů a jejich převod do funkčních specifikací. Její úlohou je také zajistit, aby implementovaná funkce odpovídala potřebám zákazníka. Marie-Sophie vystudovala inženýrskou školu ESIGELEC a svou kariéru zahájila jako inženýrka v IBM v roce 1995. Podílela se na různých projektech (projekty údržby nebo výstavby) a pracovala jako vývojářka Cobol. Poté pracovala jako UML designer a Java developer. V poslední době byly jejími hlavními rolí analyzovat a psát funkčních požadavky a koordinovat obchodní a vývojové týmy.