HUFERSIL.WEBDEVELOPER

Facilitando as chamadas ao servidor com RequestJS e jQuery

Em muito projetos eu uso HTML e jQuery.
A unica coisa que eu acho um pouco chata no jQuery é a forma das chamadas ao servidor.

Estudando ExtJS, achei muito legal a forma como ExtDirect funciona.

Então, resolvi fazer uma versão para eu poder usar em projetos com jQuery. Consiste, basicamente, de uma classe em PHP e outra JS (na verdade um objeto que não pode ser instanciado).

Ficou bem mais simples para eu trabalhar. Ainda estou testando, mas se alguém quiser se aventurar ou até mesmo me ajudar a testar/melhorar o código, qualquer ajuda será bem vinda!

Como usar

Basicamente, você precisará de quatro coisas:

  • Ajustar o proxy para indicar/mapear quais métodos das classes/serviços estarão expostos ao JS;
  • Ajustar o gateway para receber as chamadas do JS;
  • Indicar em suas classes PHP quais métodos estarão expostos para o JS, utilizando a notação @remotable (ou outra de sua preferência);
  • Indicar ao RequestJS o objeto que contém o mapeamento.

Apesar de serem 4 passos, são extremamente simples de serem feitos.

Exemplo de proxy (proxy.php)

<?php
 
date_default_timezone_set('America/Sao_Paulo');
 
include 'RequestJsParser.php';
 
$request = new RequestJsParser();
$request->generateJsProxies('services', 'services');

Exemplo de gateway (gateway.php)

<?php
 
date_default_timezone_set('America/Sao_Paulo');
 
include 'RequestJsParser.php';
 
if(empty($HTTP_RAW_POST_DATA)){
	if(count($_POST) > 0){
		$HTTP_RAW_POST_DATA = json_encode($_POST);
	} else {
		$HTTP_RAW_POST_DATA = '{}';
	}
}
 
$request = new RequestJsParser($HTTP_RAW_POST_DATA);
$request->setClasspath(dirname(__FILE__) . '/services');
$request->setBasePackage('services');
$request->proccess();

Exemplo do HTML para testes (index.html)

<html>
<head>
    <title>Usuarios</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript" src="proxy.php"></script>
    <script type="text/javascript" src="request_js.js"></script>
 
</head>
<body>
 
<textarea name="log" id="log" rows="8" cols="40"></textarea><br>
<button>Fazer chamada</button>
 
<script>
	RequestJS.gatewayURL = 'gateway.php';
	RequestJS.setRemoteAPI(RequestJsRemoteApi);
 
	$(function(){
		$('button').bind('click', function(evt){
			services.LoginService.login("hugo","teste",login_resultHandler, login_faultHandler);
		});
	});
 
	function login_resultHandler(event){
		$('#log').val( event.data + "\n" + $('#log').val());
	}
 
	function login_faultHandler(event){
		console.log('Erro', event);
	}
</script>
 
</body>
</html>

Exemplo de classe de serviço (services/LoginService.php)

<?php
class LoginService {
 
	/**
	 *
	 * @remotable
	 * @author Hugo Ferreira da Silva
	 */
	public function login($login, $senha){
		return array($login, $senha);
	}
 
	/**
	 *
	 * @remotable
	 * @author Hugo Ferreira da Silva
	 */
	public function teste_pesado(){
		return array_fill(0, 15000, microtime());
	}
}

Ou seja, ao invés de usar $.post(……), você chama direto o nome da classe, com os argumentos na mesma ordem que estão no servidor ;-)

Os arquivos vocês poderão baixar na seção de exemplos.

@braços e fiquem com Deus!

Deixar uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

*

Pode usar estas etiquetas HTML e atributos: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">