Histórico da Página
...
Nota | ||
---|---|---|
| ||
Disponível à partir da versão 12.1.6 da linha RM. |
...
Serviço
Todos os dataserver's do RM poderão ser acessados via RESTful através
...
do serviço RMSRestDataServer, sendo esse publicado automaticamente no endereço http://
...
...
...
getAvailableServices e os dados são transmitido no formato json. Por padrão esse serviço é publicado com suporte à CORS, o que permite que as páginas e o serviço em si sejam publicados em servidores diferente.
Os métodos disponibilizados pelo serviço são:
Método | URL |
---|
Nome | Descrição |
---|---|
GET | /getavailableservices?name={name}&start={start}&limit={limit} |
GetAvailableServices | Lista de todos os serviços REST dos RMSDataServer's. |
GET | /service/{serviceName}/schema |
GetExternalGrammar | Lista o schema dos dados retornados pelo serviço. |
GET | /service/{serviceName} |
GetWADL | Lista o WADL do serviço. |
GET | /rest/{dataServerName}/{id} |
Get |
Retorna o registro do dataserver especificado. | |||
GET | /rest/{dataServerName}?start={start}&limit={limit}&filter={filter} | GetAll | Retorna lista os registros do dataserver especificado. |
POST | /rest/{ |
dataServerName} |
Create |
Cria um registro utilizando o dataserver especificado. | |
DELETE | /rest/{dataServerName}/{id} |
Delete | Remove um registro utilizando o dataserver especificado. |
PUT | /rest/{dataServerName} |
/{id} | Update | Atualiza o registro |
do dataserver especificado. | |
PATCH | /rest/{dataServerName}/{id} |
Sem Formato |
---|
PUBLISH MODEL REST NAME <nome_rest_model> |
No campo <nome_rest_model> informar o identificador do Model que será utilizado no endereço de chamada do REST, como no exemplo utilizando o cadastro de clientes abaixo:
Bloco de código | ||
---|---|---|
| ||
#INCLUDE "FWMVCDEF.CH"
PUBLISH MODEL REST NAME customer
Static Function Modeldef()
Local oModel := Nil
oModel:= MPFormModel():New("MATA030",/*Pre-Validacao*/, /*Pos-Validacao*/, /*Commit*/,/*Cancel*/)
oModel:AddFields("MATA030_SA1", Nil , FWFormStruct(1,"SA1"),/*Pre-Validacao*/,/*Pos-Validacao*/,/*Carga*/)
Return(oModel) |
Nesse exemplo, baseado no exemplo de Appserver.ini , o endereço para chamada REST do Model será http://localhost:8084/html-protheus/rest/fwhtmlmodel/customer, sendo os métodos HTTP disponíveis:
Método | Queryparam | Pathparam | Descrição | Exemplo da URL |
---|---|---|---|---|
GET | start (inicio da listagem) limit (quantidade de linhas, valor padrão 10) | retorno de listagem do ModelRetorn | http://localhost:8084/hmlt-protheus/rest/fwhtmlmodel/customer?start=1&limit=50 | |
GET | id (Recno da linha da tabela) | retorno dos dados do Model | http://localhost:8084/hmlt-protheus/rest/fwhtmlmodel/customer/6 | |
POST | id (Recno da linha da tabela) | inclusão do Model | http://localhost:8084/hmlt-protheus/rest/fwhtmlmodel/customer/6 | |
PUT | id (Recno da linha da tabela) | atualização do Model | http://localhost:8084/hmlt-protheus/rest/fwhtmlmodel/customer/6 | |
DELETE | id (Recno da linha da tabela) | exclusção do Model | http://localhost:8084/hmlt-protheus/rest/fwhtmlmodel/customer/6 |
Informações |
---|
O JSON de retorno dos métodos possui a propriedade id que contém o Recno da linha tabela, além dos campos do Model |
Exemplo de retorno:
Sem Formato |
---|
{
"data": {
"A1_ABATIMP": "",
"A1_ABICS": "",
"A1_AGREG": "",
"A1_ALIFIXA": "",
"A1_ALIQIR": 0,
"A1_ATIVIDA": "",
"A1_ATR": 0,
"A1_B2B": "",
"A1_BAIRRO": ".",
"A1_BAIRROC": "",
"A1_BAIRROE": "",
"A1_BCO1": "",
"A1_BCO2": "",
"A1_BCO3": "",
"A1_BCO4": "",
"A1_BCO5": "",
"A1_CALCSUF": "",
"A1_CARGO1": "",
"A1_CARGO2": "",
"A1_CARGO3": "",
"A1_CBO": "",
"A1_CDRDES": "",
"A1_CEINSS": "",
"A1_CEP": "",
"A1_CEPC": "",
"A1_CEPE": "",
"A1_CGC": "",
"A1_CHQDEVO": 0,
"A1_CHVCAM": "",
"A1_CLASSE": "",
"A1_CLASVEN": "",
"A1_CLICNV": "",
"A1_CLIFAT": "",
"A1_CLIPRI": "",
"A1_CNAE": "",
"A1_COD": "000001",
"A1_COD_MUN": "",
"A1_CODAGE": "",
"A1_CODFID": "",
"A1_CODFOR": "",
"A1_CODMARC": "",
"A1_CODMUN": "",
"A1_CODMUNE": "",
"A1_CODPAIS": "",
"A1_CODSIAF": "",
"A1_COMAGE": 0,
"A1_COMIS": 0,
"A1_COMPLEM": "",
"A1_COND": "",
"A1_CONDPAG": "",
"A1_CONTA": "",
"A1_CONTAB": "",
"A1_CONTATO": "",
"A1_CONTRIB": "",
"A1_CRDMA": "",
"A1_CTARE": "",
"A1_CXPOSTA": "",
"A1_DDD": "",
"A1_DDI": "",
"A1_DESC": 0,
"A1_DESCAM": "",
"A1_DESCPAG": "",
"A1_DEST_1": "",
"A1_DEST_2": "",
"A1_DEST_3": "",
"A1_DIASPAG": 0,
"A1_DSATIV1": "",
"A1_DSATIV2": "",
"A1_DSATIV3": "",
"A1_DSATIV4": "",
"A1_DSATIV5": "",
"A1_DSATIV6": "",
"A1_DSATIV7": "",
"A1_DSATIV8": "",
"A1_DSCREG": "",
"A1_EMAIL": "",
"A1_END": ".",
"A1_ENDCOB": "",
"A1_ENDENT": "",
"A1_ENDNOT": "",
"A1_ENDREC": "",
"A1_ENTID": "",
"A1_ENTORI": "",
"A1_EST": "SP",
"A1_ESTADO": "",
"A1_ESTC": "",
"A1_ESTE": "",
"A1_FAX": "",
"A1_FILDEB": "",
"A1_FILIAL": "D MG",
"A1_FILTRF": "",
"A1_FOMEZER": "",
"A1_FORMVIS": "",
"A1_FRETISS": "",
"A1_GRPTRIB": "",
"A1_GRPVEN": "",
"A1_HPAGE": "",
"A1_HRCAD": "",
"A1_HREXPO": "",
"A1_HRTRANS": "",
"A1_IBGE": "",
"A1_IDESTN": "",
"A1_IENCONT": "",
"A1_IMGUMOV": "",
"A1_INCISS": "",
"A1_INCULT": "",
"A1_INDRET": "",
"A1_INOVAUT": "",
"A1_INSCR": "",
"A1_INSCRM": "",
"A1_INSCRUR": "",
"A1_IRBAX": "",
"A1_LC": 0,
"A1_LCFIN": 0,
"A1_LOJA": "01",
"A1_LOJPRI": "",
"A1_MAIDUPL": 500,
"A1_MATR": 0,
"A1_MCOMPRA": 1500,
"A1_MENSAGE": "",
"A1_METR": 0,
"A1_MINIRF": "",
"A1_MOEDALC": 0,
"A1_MSALDO": 1500,
"A1_MSBLQL": "",
"A1_MSEXP": "",
"A1_MUN": ".",
"A1_MUNC": "",
"A1_MUNE": "",
"A1_NATUREZ": "",
"A1_NIF": "",
"A1_NOME": "CLIENTE PADRAO P/ ORCAMENTO",
"A1_NREDUZ": "ORCAMENTO",
"A1_NROCOM": 3,
"A1_NROPAG": 0,
"A1_NVESTN": 0,
"A1_OBS": "",
"A1_OBSERV": "",
"A1_ORIGCT": "",
"A1_OUTRMUN": "",
"A1_PAGATR": 0,
"A1_PAIS": "",
"A1_PAISDES": "",
"A1_PERCATM": 0,
"A1_PERFECP": 0,
"A1_PERFIL": 0,
"A1_PESSOA": "",
"A1_PFISICA": "",
"A1_PRF_OBS": "",
"A1_PRIOR": "",
"A1_PRSTSER": "",
"A1_RECCOFI": "",
"A1_RECCSLL": "",
"A1_RECFET": "",
"A1_RECINSS": "",
"A1_RECIRRF": "",
"A1_RECISS": "",
"A1_RECPIS": "",
"A1_REGDES": "",
"A1_REGESIM": "",
"A1_REGIAO": "",
"A1_REGPB": "",
"A1_RESFAT": "",
"A1_RFABOV": "",
"A1_RFACS": "",
"A1_RG": "",
"A1_RISCO": "",
"A1_RTEC": "",
"A1_SALDUP": 3000,
"A1_SALDUPM": 1500,
"A1_SALFIN": 0,
"A1_SALFINM": 0,
"A1_SALPED": 0,
"A1_SALPEDL": 0,
"A1_SATIV1": "",
"A1_SATIV2": "",
"A1_SATIV3": "",
"A1_SATIV4": "",
"A1_SATIV5": "",
"A1_SATIV6": "",
"A1_SATIV7": "",
"A1_SATIV8": "",
"A1_SIMPLES": "",
"A1_SIMPNAC": "",
"A1_SUBCOD": "",
"A1_SUFRAMA": "",
"A1_SUPER": "",
"A1_TABELA": "",
"A1_TDA": "",
"A1_TEL": "",
"A1_TELEX": "",
"A1_TEMVIS": 0,
"A1_TIMEKEE": "",
"A1_TIPCLI": "",
"A1_TIPO": "R",
"A1_TIPOCLI": "",
"A1_TIPPER": "",
"A1_TIPPRFL": "",
"A1_TITPROT": 0,
"A1_TMPSTD": "",
"A1_TMPVIS": "",
"A1_TPCAMP": "",
"A1_TPDP": "",
"A1_TPESSOA": "",
"A1_TPFRET": "",
"A1_TPISSRS": "",
"A1_TPJ": "",
"A1_TPNFSE": "",
"A1_TRANSF": "",
"A1_TRANSP": "",
"A1_TRIBFAV": "",
"A1_UNIDVEN": "",
"A1_USADDA": "",
"A1_VACUM": 1500,
"A1_VEND": "",
"A1_VINCULO": "",
"A1_VM_MARC": "",
"A1_VM_OBS": "",
"id": 6
},
"length": 0,
"messages": []
} |
Update Partial | Atualiza parcialmente o registro do dataserver especificado. |
Obs.: Para utilizar dataserver de metadados, é necessário informar o nome da tabela no JSON. veja um exemplo no método Post (Create) acima.
Segurança por perfil
Todos os dataserver's do RM estão protegidos quando o acesso se dá via RMSRestDataServer. Para que a segurança seja ativada, é necessário que os DataServers sejam decorados com o atributo RMSServerSecurityInfo. Este atributo tem a mesma função que o atributo ActionInfo. Portanto, o módulo e o securityId informados devem ser iguais aos informados nas actions. Caso o atributo não seja encontrado, o acesso ao dataserver será negado.
Para cada DataServer, deve-se definir um ou mais atributos com os devidos parâmetros. Exemplo:
Expandir | ||
---|---|---|
| ||
Serialização das tabelas
vários DataSets incluem tabelas que não fazem parte da definição da entidade que o mesmo representa. Isso gera um erro ao realizar as operações do CRUD através do RMSRestDataServer. Para contornar esse problema, foram adicionadas as propriedade Master e Detail no enumerador TabProps. Essas propriedade devem ser utilizadas para marcar quais tabelas do DataSet serão serializadas. Exemplo:
Seja DS um dataset contém as tabelas A, B e C, sendo que a tabela A tem um relacionamento com a tabela B e a tabela C não faz parte da entidade que o dataset representa (somente dados de controle). Para que o serviço RMSRestDataServer funcione corretamente, a propriedade TabProps.Master deve ser adicionada à tabela A e a propriedade TabProps.Detail deve ser adicionada à tabela B.
Dessa forma somente as tabelas A e B serão serializadas, sendo a B um detalhe de A.
Atenção: Caso exista mais de uma tabela no DataSet marcada como “Master”, somente a primeira tabela, e suas filhas (caso existam), serão serializadas.
Bloco de código | ||||
---|---|---|---|---|
| ||||
DataProps.SetProps(gcoligada, TabProps.Caption, Properties.Resources.SGlbCaptionColigadas, TabProps.Id, "CODCOLIGADA;NOMEFANTASIA", TabProps.Master, true); |
Filtros
Ao utilizar o parâmetro &filter={filter}, será possível utilizar qualquer campo (desde que seja da tabela Master).
Aviso |
---|
Não são aceitos nos filtros campos de tabelas Detail! |
...