1. Introdução
O JSON (JavaScript Object Notation) é um modelo leve para armazenamento e transmissão de informações no formato texto. Embora simples, este modelo tem sido bastante utilizado por aplicações web devido a sua capacidade de estruturar informações de uma forma mais compacta em comparação com o modelo XML.
Em JSON, os dados são apresentados da seguinte forma:
Um objeto é um conjunto desordenado de pares nome/valor; ele começa com { (chave de abertura) e termina com } (chave de fechamento). Cada nome é seguido por : (dois pontos), e os pares nome/valor são seguidos por , (vírgula).
Um array é uma coleção de valores ordenados; ele começa com [ (colchete de abertura) e termina com ] (colchete de fechamento). Os valores são separados por , (vírgula).
Exemplo de uma estrutura JSON:
[ { "id": 1, "username": "ElipseRS", "password": "Eli123" }, { "id": 2, "username": "ElipseSP", "password": "EliSP123" }, { "id": 3, "username": "ElipseMG", "password": "ElipMG123" } ]
Neste artigo, veremos como consumir e enviar dados através do Elipse E3 a um webservice desenvolvido em formato JSON.
2. Webservice JSON
Um webservice no formato JSON foi desenvolvido para a simulação de valores. Quanto à confirmação dos dados da solicitação HTTP: no POST, foram retornados os valores enviados e uma mensagem de sucesso no envio (no formato JSON); no GET, foram retornados valores conforme padrão estabelecido pelo protocolo.
Formato do webservice utilizado:
[
{
"id":1,
"email":"scherer@elipse.com.br",
"username":"scherer",
"password":"password"
},
{
"id":2,
"email":"delio@elipse.com.br",
"username":"delio",
"password":"password123"
},
{
"id":3,
"email":"enrico@elipse.com.br",
"username":"enrico",
"password":"password321"
}
]
3. Integrando o Elipse E3 com o Webservice JSON
Assim como o XML, o VBScript não suporta o tratamento do JSON de modo nativo. Uma alternativa é utilizar uma classe em VBScript que faça a análise sintática (parsing) de uma string em JSON (iniciada com “{” ou com “[“), ou que opcionalmente faça uma chamada HTTP utilizando o componente “msxml2.ServerXMLHTTP” e avalie a string JSON retornada por esta chamada.
NOTA: A string utilizada para a criação do componente Microsoft® XML Core Services (MSXML) pode variar de acordo com a versão disponível no sistema. É possível verificar quais DLLs “msxml” estão presentes no computador na pasta C:\Windows\system32.
Em determinadas situações, o componente Microsoft® XML Core Services (MSXML) pode ser incompatível com o WebService utilizado. Nestes casos, ao criar o objeto substitua o CreateObject(“Msxml2.ServerXMLHTTP“) por CreateObject(“Msxml2.XMLHTTP“).
4. Consumindo dados do webservice (GET)
O script abaixo foi utilizado para realizar a leitura dos dados do webservice:
Sub CommandButton1_Click() Dim oJsonParser Set oJsonParser = new aspJSON 'Criação do objeto tipo aspJSON 'Inserir endereço do Webservice URL = "http://www.filltext.com/?rows=3&id={index}&email={email}&username={username}&password={randomString|5}&pretty=true" oJsonParser.LoadJSON(URL) 'Carregando objeto JSON For i = 0 to oJsonParser.data.count - 1 Screen.Item("ID"&i&"").Value = oJsonParser.data(i).item("id") Screen.Item("Email"&i&"").Value = oJsonParser.data(i).item("email") Screen.Item("User"&i&"").Value = oJsonParser.data(i).item("username") Screen.Item("Password"&i&"").Value = oJsonParser.data(i).item("password") Next End Sub
NOTA: A classe aspJSON referenciada acima não foi exibida, mas ela é responsável por realizar o parsing em uma string JSON. Na aplicação exemplo em anexo, esta classe estará disponível.
5. Escrevendo no Webservice (POST)
Para realizar a escrita no webservice, foi utilizado o objeto ServerXMLHTTP, que fornece métodos e propriedades que permitem estabelecer uma conexão HTTP entre arquivos ou objetos em diferentes servidores web. O script abaixo foi utilizado para realizar a escrita dos dados no webservice:
Sub CommandButton2_Click() Dim objXmlHttpMain , URL strJSONToSend = "{""id"": ""0"", ""email"": ""elipse@elipse.com.br"", ""username"": ""Elipse"", ""password"": ""Elipse123""}" URL="http://scherer:5000/users/" 'Endereço do webservice Set objXmlHttpMain = CreateObject("Msxml2.ServerXMLHTTP") On Error Resume Next objXmlHttpMain.open "POST",URL, False If Err Then 'handle errors Msgbox Err.Description & " [0x" & Hex(Err.Number) & "]" End If On Error Goto 0 objXmlHttpMain.setRequestHeader "Content-Type", "application/json" objXmlHttpMain.send strJSONToSend strResponse = objXmlHttpMain.responseText msgbox strResponse End Sub
6. Aplicação exemplo
O exemplo em anexo foi desenvolvido na versão 4.7 build 252 do Elipse E3 e projetado para ser compatível com a estrutura do webservice ilustrado no item 2. Para atender a outros formatos, será preciso adaptá-lo, e consequentemente, o endereço da URL do webservice deve ser alterado no script.
Em anexo, também há um exemplo que realiza a leitura de um Webservice JSON via Driver Elipse VBScript.
Assista o vídeo relacionado a este artigo também em nosso canal do YouTube.
Bom dia.
Preciso acessar uma estrutura mais complexa de dados json. Onde consigo a documentação para conseguir desenvolver minha aplicação?
Sim
Bom dia Vitor,
Se você possui uma estrutura JSON de arrays com tamanhos variáveis, e não apenas objetos de pares nome/valor, você precisará percorrer os arrays inserindo novos laços (for) dentro do script.
Exemplo de estrutura JSON:
{
"status": "ok",
"message": "Devices list successfully fetched",
"devices": [
{
"id": 3,
"addr": "RS1-003",
"name": "New_XR75CX",
"model": "002C-0063-0058-XR75CX",
"enabled": true,
"protocol": "dixelldev",
"serial": "1,9600,n,8,1,30,5,2"
},
{
"id": 4,
"addr": "RS1-004",
"name": "New_XR75CX",
"model": "002C-0063-0058-XR75CX",
"enabled": true,
"protocol": "dixelldev",
"serial": "1,9600,n,8,1,30,5,2"
}
]
}
Parte do script utilizado para receber os dados:
DIM oJsonParser
Set oJsonParser = new aspJSON 'Criação do objeto tipo aspJSON
'Inserir endereço do Webservice
URL = "http://localhost:8080/Json"
oJsonParser.LoadJSON(URL) 'Carregando objeto JSON
for i = 0 to oJsonParser.data.count - 1
Screen.Item("status").Value = oJsonParser.data(i).item("status")
Screen.Item("message").Value = oJsonParser.data(i).item("message")
for b = 0 to oJsonParser.data(i).item("devices").count -1
Screen.Item("id"&b&"").Value = oJsonParser.data(i).item("devices").item(b).item("id")
Screen.Item("addr"&b&"").Value = oJsonParser.data(i).item("devices").item(b).item("addr")
Screen.Item("name"&b&"").Value = oJsonParser.data(i).item("devices").item(b).item("name")
Screen.Item("model"&b&"").Value = oJsonParser.data(i).item("devices").item(b).item("model")
Screen.Item("enabled"&b&"").Value = oJsonParser.data(i).item("devices").item(b).item("enabled")
Screen.Item("protocol"&b&"").Value = oJsonParser.data(i).item("devices").item(b).item("protocol")
Screen.Item("serial"&b&"").Value = oJsonParser.data(i).item("devices").item(b).item("serial")
Next
Next
End Sub
Se encontrar dificuldade, envie a sua estrutura JSON para eu verificar (delio@elipse.com.br).
Bom dia, eu consigo consumir/enviar dados para um serviço Rest utilizando Msxml2.ServerXMLHTTP?
Bom dia Eurípedes,
Em determinadas situações, o componente Microsoft® XML Core Services (MSXML) pode ser incompatível com o WebService utilizado.
Portanto, ao criar o objeto substitua o CreateObject(“Msxml2.ServerXMLHTTP“) por CreateObject(“Msxml2.XMLHTTP“).
Obrigado pela atenção.
Segue um pedaço da chamada que estou fazendo ao serviço Rest, porém o readyState não sai do 1, veja se consegue me ajudar, creio que esteja esquecendo algo ou fazendo errado msm:
Set HttpReq = Server.CreateObject(“MSXML2.XMLHTTP.6.0”)
HttpReq.Open “POST”, Session(“url_acompanhamento_servico”), false
HttpReq.SetRequestHeader “Authorization”, Session(“Authorization”)
HttpReq.SetRequestHeader “Content-Type”, “application/json;charset=UTF-8”
HttpReq.SetRequestHeader “Accept”, “application/json”
HttpReq.send strJSON
Olá amigo,
parabens pelo artigo.
Estou precisando utilizar o oJsonParser.LoadJSON(URL) , só que no lugar da URL, preciso colocar um arquivo, tipo “teste.json”.
Você conseguiria dar um exemplo?
Desde já, Obrigado!
Estou obtendo um erro na linha 89 na class aspJSON.
Linha: Set level(aj_currentlevel + 1) = level(aj_currentlevel).Item(aj_currentkey)
Erro: Subscrito fora do intervalor: ‘[number: 100]’
Esquece, funcionou!
Boa tarde!
Preciso fazer leitura de uma variável em um servidor web, mas o mesmo não é liberado como o exemplo do CEP, precisa configurar o HEADER acrescentando o campo Authorization.
Boa tarde!
Preciso fazer leitura de uma variável em um servidor web, mas o mesmo não é liberado como o exemplo do CEP, precisa configurar o HEADER acrescentando o campo Authorization.
Alguém sabe como implementar?
Desde já agradeço!
Preciso enviar dados que estão requeridos da seguinte forma:
{
“idLote”: 0,
“idLocalOrigem”: 0,
“idLocalDestino”: 0,
“peso”: 0
}
Essa estrutura está no JSON.
Estou utilizando no E3 o seguinte Script:
Dim objXmlHttpMain , URL
strJSONToSend = “{“”idLote””: ” &Screen.Item(“idLote”).Value &”, “”idLocalOrigem””: ” &Screen.Item(“idOrigem”).Value &”,””idLocalDestino””: “&Screen.Item(“idDestino”).Value&”,””peso””: “&Screen.Item(“Peso”).Value&”}”
Porém, não consigo adicionar o peso, testando diretamente no ambiente de homologação funciona. Mas pelo E3 não vai. Alguém poderia me ajudar?
O seguinte erro é apresentado quando executado o domínio
Erro na Linha 43: ‘Erro de sistema: -2147012890. (msxml3.dll)
Algum palpite ?
E se a URL for HTTPS ? como faço ?