Pessoal,
Penso em produzir um script em um point de um meta data source, então segui lendo sobre Rhino e minha pergunta esta baseada no seguinte conceito: Rhino me permiti rodar java script no server-side ( ScadaBR).
Tenho uma segunda aplicação web, na qual produzi um RESTful, esta aplicação tem um BD com uma tabela "person" e através do browser posso realizar: GET, POST, PUT e DELETE da seguinte forma (GET):
então recebo o retorno:
- <?xml version="1.0" encoding="UTF-8"?><document><name>Dadatota</name><birthdate>2008-04-28</birthdate><id>1</id></document>
onde Dadatota é o nome com id=1 da tabela person
Assim posso realizar um CRUD na tabela "person".
Como este é meu primeiro contato com JS e Rhino, fiz varias tentativas de construir um script sem sucesso. Minha ideia é que uma var receba o xml, então faço algo como um RegEX e obtenho o dado desejado:
Sou iniciante em todos esses conceitos, logo correções são bem vindas.
Qualquer ajuda?
OK, consegui atingir o objetivo, então vou descrever o caminho que segui:
Conceitos:
- Rhino é uma implementação em Java do Interpretador JavaScript.
- ·Interpretador JavaScript, normalmente são embutidos nos Browser’s(side-client), assim pode-se customizar o comportamento do Browser.
- Com a motivação de permitir os usuários customizar o comportamento de uma aplicação em Java, pode-se embutir na aplicação o interpretador JavaScrip, sendo no caso de aplicação Java deve-se usar a implementação do interpretador produzida em Java, o Rhino.
- Com o Rhino embutido na aplicação Java você pode interagir com objetos Java, fazendo get e set nos fields e chamando os métodos do objeto Java.
- ScadaBR é uma aplicação Java com o Rhino embutido, logo tem a capacidade de “scripting”.
- Assim, você tem JavaScript rodando no server-side.
- Para usar TODO o potencial de script no ScadaBR, e necessário o conhecimento de JavaScript AND Java. AND como função lógica.
- O simbolo global Packages prove acesso a todos os pacotes Java que o interpretador JavaScript conhece.
Solução:
- Packages.java;
- // para importar um pacote Java use importPackage()
- importPackage(java.net);
- importPackage(java.io);
- var e = new MalformedURLException();
- var search = "";
- search += card.value;
- try{
- · var urlBase = new URL("http://192.168.1.3/myapp/default/");
- · var url= new URL(urlBase,("get_person/"+search +".json"));
- //Observe que mudei a extensão da URL para json, porque jsom é mais rapido e mais fácil que xml. O retorno em json: {"name": "Dadatota", "birthdate": "2008-04-28", "id": 1}
- · var urlStream = url.openStream();
- · var stream = new InputStreamReader(urlStream,"US-ASCII");
- }
- catch ( e) {
- return "NG";
- }
- var response ="";
- var i = 0;
- while(stream.ready()>0){
- response += String.fromCharCode(stream.read());
- i++;
- }
- urlStream.close();
- // Neste ponto há uma forma elegante de recuperar o valor Dadatota considerando que response esta no formato json, entretanto após implementado, de forma aleatória retorna SyntaxError, então resolvi com manipilação de strings.
- var startFiledValue = response.search(":");
- var endFieldValue = response.length;
- var str = response.slice(startFiledValue+3,endFieldValue);
- endFieldValue = str.search('"');
- var str1 = str.slice(0,endFieldValue);
- return str1 ;
Segue código usando o potencial de json para interagir com response:
- Packages.java;
- importPackage(java.net);
- importPackage(java.io);
- var e = new MalformedURLException();
- var search = "";
- search += card.value;
- try{
- · var urlBase = new URL("http://192.168.1.3/myapp/default/");
- · var url= new URL(urlBase,("get_person/"+search +".json"));
- · var urlStream = url.openStream();
- · var stream = new InputStreamReader(urlStream,"US-ASCII");
- }
- catch ( e) {
- return "NG";
- }
- var response ="";
- var i = 0;
- while(stream.ready()>0){
- response += String.fromCharCode(stream.read());
- · i++;
- }
- urlStream.close();
- //Script error: SyntaxError: syntax error (#34(eval)#1) in #34(eval) at line number 1 in //#34(eval) at line number 1
- var obj = eval ("(" + response + ")");
- return obj.name
- //muito mais elegante!
Assim, espero contribuir para aqueles, que como eu, percebe o potencial do script e não tem profundo conhecimento nas linguagens JavaScript e Java, de tal forma que pelo beneficio, compensa tentar apreender um pouco mais, e o exemplo mostra o inicio do caminho.
Olá Vicente,
Parabéns! Fantástica sua implementação.
Fica como um ótimo exemplo para os usuários do ScadaBR sobre o poder do ServerSideScript =]
Nós temos uma maneira mais humilde de fazer um GET/POST via http através dos data sources HTTP Receiver e Retriever, e pelo Publisher HTTP;
Mas adoramos sua idéia.
Att.
Obrigado.
No inicio eu havia tentado a maneira mais humilde:
http://192.168.1.3/myapp/default/get_person/1.json, onde aqui search = 1, entretanto tendo search como variavel para o desejado GET, usando data source do tipo HTTP Receiver, a variavel acaba sendo constante, assim eu deveria criar tantos HTTP Receiveirs quantos fossem necessários e tendo muitas necessidades abandonei a abordagem e resolvi entender o poder do SCRIPT.
Olá,
Eu estou tentando escrever uma variável modbus utilizando um FORM post ou get na própria view do ScadaBR.
Para isso eu criei uma variável Receptor HTTP, e criei uma variável que pretendo escrever utilizando um formulário para melhorar a aparência, e posteriormente utilizar o server-side script para linkar as duas.
Porém não estou conseguindo fazer o form funcionar, eu até consigo escrever a variável, mas não encontrei um maneira de me manter na mesma página, sem recarregar nada.
<FORM METHOD=GET ACTION="http://192.168.0.100:8080/ScadaBR/httpds?">
Novo Valor: <INPUT NAME="meuVarHTTP"><BR>
<INPUT TYPE=SUBMIT>
</FORM>
Olá
Descobri que o que eu queria fazer estava errado. Era muito mais fácil fazer utilizando um serverside script direto para a variável!
De qualqeur forma, obrigado!
Amigos, especialmente o vicente,
coloquei outro post sobre acessar dados de um equipamento via http post usando autenticação no formato json.
dá uma olhada, quem sabe não pode ajudar.