ORDA Classes de modelos de dados e REST

Tradução automática de Deepl

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
$obj
numberOfStudents$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:

{
"__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"
: [_PRIMEIRO”: [_PRIMEIRO 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!

Avatar
• Proprietário do produto - Marie-Sophie Landrieu -Yvert entrou ao time 4D Product como Proprietária do Produto em 2017. Como tal, está a cargo de escrever as histórias dos usuários e depois traduzi-las em especificações funcionais. Seu papel também é garantir que a implementação da funcionalidade entregue cumpra com as necessidades do cliente. Marie-sophie se formou na Escola de Engenharia de ESIGELEC e começou sua carreira como engenheira da IBM em 1995. Participou em vários projetos (de manutenção e criação) e trabalhou como desenvolvedora de Cobol. Depois trabalhou como designer de UML e desenvolvedora de Java. Suas principais funções foram analisar e redigir requisitos funcionais, coordenar os times de negócio e de desenvolvimento.