Num post de blog anterior, tomou conhecimento das aulas ORDA e das possibilidades que elas oferecem para tornar a sua experiência de codificação mais suave. Neste post do blog, verá como utilizá-los com o servidor REST.
Vamos vê-lo em acção!
HDI: Exemplos para usar as classes ORDA com o servidor REST
Temos uma base de dados chamada LearningSystem que contém as seguintes tabelas:
Esta base de dados está exposta como um servidor REST no localhost (porta 8044). Todas as funções definidas nas suas classes podem ser chamadas utilizando pedidos REST numa operação POST.
Chamada de uma função definida na classe de datastore
O objecto datastore é recuperado utilizando o prefixo /rest/$catalog.
Uma função getStatistics() foi definida na classe DataStore datastore da DataStore. A função retorna uma colecção com informações sobre as escolas.
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
Pode chamá-lo com a URL http://127.0.0.1:8044/rest/$catalog/getStatistics.
Aqui está a resposta do servidor:
{
"resultado": {
{
"nome": "old school",
"cidade": "Solebury",
"númeroOfStudents": 3
},
{
"nome": "Instituto de História",
"cidade": "Solebury",
"numberOfStudents": 3
},
{
"nome": "4D Universidade",
"cidade": "Hummelstown",
"numberOfStudents": 3
}, }
]
} }
Chamar uma função definida numa classe de classe de dados
Um objecto dataclass é acedido através do prefixo /rest/dataClassName.
Uma função registerStudent() foi definida na classe Dataclass das Escolas. A função recebe os dados do aluno num objecto e verifica se o nível de inglês do aluno corresponde ao nível exigido pela escola. Se o seu nível de inglês estiver OK, a função cria e salva a entidade Estudantes.
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("sucesso";True)
If ($data.englishLevel < $school.minAcceptedEnglishLevel)
$result .success:=False
$result .statusText:="O nível de inglês não é suficiente"
$0 :=$result
End if
If ($result.success)
$student :=ds.Students.new()
$student .fromObject($data)
$student .finalExam:="Para levar"
$student .school:=$school
$result :=$student.save()
$0 :=$student
End if
É acessível através do URL http://127.0.0.1:8044/rest/Schools/registerStudent.
Os parâmetros devem ser passados como uma colecção, no corpo do pedido:
[
“:
{
"firstname": "Maria",
"sobrenome": "Smith",
"englishLevel": 2,
"schoolName": "schoolName"Math school":
}
]
Aqui está a resposta do servidor:
{
“:
"__entityModel": "Estudantes",
"__DATACLASS": "Estudantes",
"__KEY": "9",
"__TIMESTAMP": "2020-06-03T13:08:13.542Z",
"__STAMP": 1",
"ID": 9,
"firstname" (nome próprio): "Maria",
"último nome": "Smith",
"englishLevel": 2,
"schoolID": "schoolID 4,
"finalExam": "finalExam": "To take",
"school": {
"__deferred": {
"uri": {{_deferred": "uri": "/rest/Schools(4)",
"__KEY": "4":
}
}
}
Chamar uma função definida numa classe de entidade
Um objecto de entidade é acedido através do prefixo /rest/dataClassName(chave), onde a chave é a chave primária da entidade.
Uma função studyingInSameCity() foi definida na classe da entidade StudentEntity. Ela devolve todos os outros estudantes que estudam na mesma cidade que o Estudante actual.
Class extends Entity
Function studyingInSameCity
C_OBJECT($0;$city)
$city :=This.school.city
$0 :=$city.schools.students.minus (
This)
Este exemplo é para uma entidade com chave primária = 7. É acedido através do http://127.0.0.1:8044/rest/Students(7)/studyingInSameCity/?$attributes=primeiro nome, último URL.
Aplicamos o studyingInSameCity() nesta entidade e filtrar os atributos devolvidos para obter apenas o primeiro e último nome (/?$attributes=primeiro nome, último nome).
Aqui está a resposta do servidor:
{
: [_PRIMEIRO”: [_PRIMEIRO
"__DATACLASS": "Estudantes",
"__entityModel": "Estudantes",
"__GlobalStamp": 0,
"__COUNT": 3,
"__FIRST": "__FIRST": "__FIRST": 0,
"__ENTIDADES": 0, "__ENTIDADES": [
{
"__KEY": 5",
"__TIMESTAMP": [_TIMESTAMP": "2020-06-16T13:59:51.095Z":
"__STAMP": [_TIMESTAMP" 1",
}
"firstname": "Ricky",
"sobrenome": "Coyle"
},
{
"__KEY": "6",
"__TIMESTAMP": "2020-06-16T13:59:51.095Z",
"__STAMP": 1,
"firstname": "Alonzo",
"último apelido": "Zapata": "Zapata"
}
],
"__SENT": 3
}
Chamar uma função definida numa classe de selecção de entidade
Um objecto de selecção de entidade pode ser acedido através da sintaxe do filtro. Por exemplo, /?$filter=”finalExam=’To take'” para obter todos os estudantes com um valor de “To take” para o atributo finalExam.
Uma selecção de entidade pode ser acedida através de outras formas, por isso não se esqueça de verificar a documentação.
Uma função setFinalExam() foi definida na classe de selecção de entidade StudentsSelection. Esta actualiza o atributo finalExam de cada aluno com o valor dado.
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
Neste exemplo, está acessível através do http://127.0.0.1:8044/rest/Students/setFinalExam/?$filter=”finalExam=’To take'”. URL.
Aqui está o corpo do pedido:
[
"Aprovado"
]
Aqui está a resposta do servidor (todos os estudantes envolvidos foram devidamente actualizados):
{
"resultado": {
"sucesso": verdadeiro
}
}
Descarregue o HDI para ver tudo o que foi dito acima em acção.
Nota:
Não se esqueça de verificar este post sobre palavras-chave. Desde 4D v18 R5, as funções não são expostas por defeito. Não se esqueça de marcar as funções que pretende expor!