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
$objnumberOfStudents$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!