Página 1 de 1

[NET] [Tutorial] Tratando strings recebidas do servidor

Enviado: Sex Abr 29, 2016 1:30 pm
por Tutoriais & Aulas
Autor original: GabrielXavier
  • 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: Selecionar todos

<?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: Selecionar todos

<?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: Selecionar todos

//----- 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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

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: Selecionar todos

//----- 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!

Re: [NET] [Tutorial] Tratando strings recebidas do servidor

Enviado: Qua Set 14, 2016 5:19 pm
por SIGILOSO
Fala Gabriel, excelente tutorial.
Sou leigo com questões de servidor, e quando fui testar, encontrei esse erro. A url que eu usei pra testar é do meu dropbox, então não sei se foi a causa do erro, exatamente (é sério, eu sou bem leigo mesmo)

Código: Selecionar todos

___________________________________________
############################################################################################
FATAL ERROR in
action number 1
of Async Event: HTTP
for object object0:

string_count argument 2 incorrect type (5) expecting a String (YYGS)
 at gml_Script_scr_tratando_string (line 8) - n_m_r=1+string_count(",",t_x_t); // Retorna o numero de parametros passados
############################################################################################
--------------------------------------------------------------------------------------------
stack frame is
gml_Script_scr_tratando_string (line 8)
called from - gml_Object_object0_WebAsyncEvent_1 (line 3) - nmr=scr_tratando_string(list,texto); // Chama a fução para tratar as strings, retorna o numero de dados obtidos

Eu vou precisar produzir um game que se conecta com um servidor para buscar o nome, login e score do usuário, mas não bem como proceder. Mas o seu tutorial e o que você indicou estão sendo de grande valia (se eu não encontrar erros, mas porque eu não soube fazer mesmo) =)

Re: [NET] [Tutorial] Tratando strings recebidas do servidor

Enviado: Qui Set 15, 2016 8:28 am
por GabrielXavier
SIGILOSO eu não to com tempo agora para fazer testes, eu não sei se o dropbox é um servidor PHP tbm, mas creio que não é, você vai ter que hospedar seu arquivo PHP em um servidor WEB mesmo, recomendo a HOSTINGER que da para criar uma conta gratuita que aceita PHP.
Eu não me lembro bem mas creio que da para testar localmente também usando o WAMPSERVER, ele cria um servidor PHP na sua maquina e você usa URL como http://localhost/projeto1/index.php pesquisa na internet como usar o wampserver.


Quando eu voltar se você não tiver resolvido o erro tento ver se é isso mesmo, mas creio que seja sim, pois o arquivo PHP necessita de um servidor "especial" para funcionar