[Tutorial] Tratando strings recebidas do servidor

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

[Tutorial] Tratando strings recebidas do servidor

Mensagem por GabrielXavier em Dom 31 Ago 2014, 21:36


  • Título: Tratando strings recebidas do servidor - http_get
  • Versão do GM: Game Maker Studio
  • Dificuldade: Mediano
  • Link para download da Engine: Indisponivél
  • Requer Extensões: Não.
  • Requer DLLs: Não.
  • Tags: Ler online; Tratando strings; Dados no servidor;


Bom aqui estudando sobre o nativo online do GMS PHP e MYSQL aprendi bastante coisa e me veio aquela vontade de fazer um tutorial, pensei um pouco e decidi fazer um tutorial que ensine a tratar as strings recebidas de um servidor atravez da função http_get,
Aprendi este metodo usando o tutorial do Fredcobain mas não sabia como tratar as strings recebidas então bolei um pequeno script que "divide" o texto recebido em partes como Nome, Senha, Nivel ou qualquer coisa que você quiser.
Não vou ensinar a usar a função Http_get pois o tutorial do Fred ja está otimo então segue o link:

Lendo (e carregando) arquivos online

Optei por baixar as informações de uma pagina PHP e não de um arquivo INI como no tutorial do Fred.

A função http_get("http://Tutorial.php"); retorna toda a impressão que esta sendo feita na pagina php cujo link foi passado, por exemplo, uma pagina php com este codigo:
Código:
<?php

echo "Olá Gabriel Xavier";

?>
Imprimira na tela  o texto "Olá Gabriel Xavier" e caso o http_get esteja acessando esta pagina o texto que sera retornado será exatamente o mesmo que esta sendo impresso pela pagina php.

Então, mulecada já sabemos oque será retornado sempre que utilizarmos a função http_get, strings e mais strings.

Mas eis a questão, como vou saber oque é nome de usuario? Oque é senha??
Bem isso não é tão complexo como parece!

Pensando em uma pagina php com o seguinte codigo:

Tutorial.php

Código:
<?php

$nome="Gabriel";
$senha="12345";
$nivel="50";
$xp="130";

echo "$nome,$senha,$nivel,$xp";

?>

Ao utilizar a função http_get("http://Tutorial.php"); o retorna seria a seguinte string "Gabriel,12345,50,130" (sem as aspas).

Mas e agora Gabriel? Como separar estes dados?
Acalme-se! É bem simples.

Para desembaraçar esses dados usaremos o seguinte script que fiz:
Código:
//----- Script de tratamento de strings-----//
/*
argument0 - id da lista que armazenara as strings tratadas
argument1 - string a ser tratada
*/

ds_list_clear(argument0); // limpa a lista para receber novos dados

t_x_t=argument1; // salva a string passada na variavel
n_m_r=1+string_count(",",t_x_t); // Retorna o numero de parametros passados

for(_i_=1;_i_<=n_m_r;_i_+=1){ // Se i for menor ou igual ao numero de parametros na string

 if (_i_=n_m_r) // se for a ultima string então o unico texto que resta na variavel t_x_t é o ultimo parametro
  {
  ds_list_add(argument0,t_x_t); // Então salvamos a string na ds_list
  break; // e encerrams o laço FOR
  }
  
   p_o_s=string_pos(",",t_x_t); // Identifica a posicao da proxima virgula
   ds_list_add(argument0,string_copy(t_x_t,1,p_o_s-1)); // Adiciona o pedaço da string na lista
   t_x_t=string_delete(t_x_t,1,p_o_s); // Deleta a parte da string que ja guardamos na lista
  
}

return n_m_r; //Retorna o numero de parametros na string passada, para saber o tamanho da lista por exemplo

Caraca mano! Oque? Como isso funciona?

Bom a ideia desse pequeno script é a seguinte,

Ele pega a string que foi retornada pela http_get digamos que essa string é a seguinte:
Código:
texto="Gabriel,12345,50,130";

O script é simples, ele recebera dois argumentos o "argument0" recebe o id de uma ds_list feita exclusivamente para armazenar estes dados, o segundo argumento "argument1" recebe a string a ser dividida.

A função string_count(substring,string) retorna quantas ocorrencias de substring foi ocorrida em string, em outras palavas ela retona quantas vezes o caractere em questão foi encontrado na string, então essa função em nosso codigo conta quantas virgulas foram encontradas na string texto="Gabriel,12345,50,130";


Reparando que na string texto há 4 parametros (Nome=Gabriel,Senha=12345,Nivel=50,Xp=130) mas so existem 3 virgulas "," então por isso existe um "+1" em nosso script n_m_r=1+string_count(",",t_x_t); pois precisamos saber o numero de parametros que serão recebidos em nossa string baixada do pagina php.
Obs: As virgulas são quem nos indicaram onde termina um parametro.

Já expliquei bem a função acima e ela creio eu que seja a parte mais importante do nosso script pois ela possibilita que inumeros parametros sejam passados e salvos de forma "automatica" em nosso script.

Após identificar o numero de parametros que foram passados na string o proximo passo é identificar onde termina o nosso primeiro parametro que predefinidamente termina na primeira virgula texto="Gabriel,12345,50,130"; quem é responsavél por encontrar esta virgula é a função p_o_s=string_pos(",",t_x_t); que retorna em p_o_s a posição que está nossa primeira virgula que no caso é a posição 8.
Então ja sabemos que o nosso nome de usuario começa na posição 1 da string e vai ate a posição 7 pois a posição 8 ja é a virgula que separa nossos argumentos


Agora que ja sabemos onde termina nosso primeiro parametro precisamos separa-lo do restante do texto e salva-lo em algum lugar e quem fará isso é a função string_copy(string,começo,fim) esta função ira retornar a string que esta na posição começo ate a string que esta na posição fim em (em nosso script string_copy(t_x_t,1,p_o_s-1)).

Pronto \o/ finalmete conseguimos separar nosso nome de usuario do restante da string, agora precisamos salva-lo, mas salva-lo onde?
Em uma ds_lis, lembra que passamos o id de uma ds_list la no argument0 do nosso script? Bom é nela que vamos guardar o nosso nome de usuario na posição 0 dessa ds_list! 
ds_list_add(argument0,string_copy(t_x_t,1,p_o_s-1));

Como iremos pegar o restante dos nossos dados nessa string?

A ideia é a mais simples de todas (óóóóhhhh como?) usando a função string_delete(string,começo,fim); esta função ira deletar a string entre os indices começo e fim e retorna o resto, então é bem simples a função deleta de nossa string esta parte em negrito "Gabriel,12345,50,130".


Observaram que existe um laço for em nosso script? Não? Volta la e olha!
Este laço sabe quantos parametros temos em nossa string pois ele esta usando como referencia os dados retornados pela função string_count(substring,string) explicada acima então este laço for irá roda exatamente o numero de parametros da string em voltas, agora ficou facil, cada volta do nosso for será salvo um parametro em nossa ds_list e esse mesmo parametro mais a primeira virgula serão deletados da nossa string.

Após a primeira volta nossa string fica assim "12345,50,130", após a segunda volta fica assim "50,130e após a terceira fica assim "130", mas e agora Gabriel? 
Não temos mais uma virgula para pegar como referencia para sabermos onde termina nosso proximo parametro ://

Cara na boa repara bem! 
So nos restou um parametro! 

Não temos outro então oque resta em nossa string é simplemente o nosso ultimo parametro!
Sim mas e como nosso laço for ira saber que ja é hora de parar? A varias formas de fazer isso decidi usar um if para verificar qual será nossa ultima volta, caso seja nossa ultima volta do laço for entramos no if salvamos nosso ultimo parametro na nossa ds_list e damos um break para finalizar o laço for.

Por ultimo retornamos o numero de parametros que foram salvos para sabermos quantos indices tem em nossa ds_list.

Agora vou mostrar como usar esse script, é importante lembrar de colocar os dados sempre na mesma ordem quando impressos em sua pagina php e quando salvos em sua ds_list.

Create
Código:
list=ds_list_create(); // Cria a lista que guardara as strings baixadas do servidor
http_get("Link de sua pagina php"); // Acessa o link

aux=noone; // Variavél que checara se podemos imprimir algo na tela


Asynchronous>HTTP
Código:

texto=ds_map_find_value(async_load,"result"); // Salva o texto recebido na variavel

nmr=scr_tratando_string(list,texto); // Chama a fução para tratar as strings, retorna o numero de dados obtidos

//scr_tratando_string(id_da_lista,string);

aux=ds_map_find_value(async_load,"http_status"); //  caso retorne 200 a sincronia foi bem sucedida


Draw
Código:
if (aux=200){//se for = 200 podemos imprimir

  draw_text(10,15*1,"Nome:"+string(ds_list_find_value(list,0)));
  draw_text(10,15*2,"Senha:"+string(ds_list_find_value(list,1)));
  draw_text(10,15*3,"Nivel:"+string(ds_list_find_value(list,2)));
  draw_text(10,15*4,"XP:"+string(ds_list_find_value(list,3)));
  
}

E criamos um script:

scr_tratando_string
Código:
//----- Script de tratamento de strings-----//
/*
argument0 - id da lista que armazenara as strings tratadas
argument1 - string a ser tratada
*/

t_x_t=argument1; // salva a string passada na variavel
n_m_r=1+string_count(",",t_x_t); // Retorna o numero de parametros passados

for(_i_=1;_i_<=n_m_r;_i_+=1){ // Se i for menor ou igual ao numero de parametros na string

 if (_i_=n_m_r) // se for a ultima string então o unico texto que resta na variavel t_x_t é o ultimo parametro
  {
  ds_list_add(argument0,t_x_t); // Então salvamos a string na ds_list
  break; // e encerrams o laço FOR
  }
  
   p_o_s=string_pos(",",t_x_t); // Identifica a posicao da proxima virgula
   ds_list_add(argument0,string_copy(t_x_t,1,p_o_s-1)); // Adiciona o pedaço da string na lista
   t_x_t=string_delete(t_x_t,1,p_o_s); // Deleta a parte da string que ja guardamos na lista
  
}

return n_m_r; //  retorna o numero de parametros na string passada, para saber o tamanho da lista por exemplo


Pronto agora está apto a carregar dados de seus jogos em um banco de dados na nuvem!!!

ABRAÇOS!


Última edição por GabrielXavier em Dom 21 Set 2014, 17:30, editado 2 vez(es) (Razão : Correções Gramaticais)

GabrielXavier

Ranking : Nota A
Número de Mensagens : 359
Data de inscrição : 25/02/2012
Notas recebidas : A
Reputação : 15
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 1
   : 1

Voltar ao Topo Ir em baixo

Re: [Tutorial] Tratando strings recebidas do servidor

Mensagem por fredcobain em Qua 10 Set 2014, 17:49

Gabriel, maravilha de tutorial.

Bem explicado, bem identado, bastante útil.

Resumindo: Staff Choice!

Parabéns e obrigado pela contribuição!

fredcobain

Ranking : Sem avaliações
Número de Mensagens : 691
Idade : 35
Data de inscrição : 14/04/2011
Reputação : 162
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum