LogIn UWP C # + MySQL + PHP

1

Hello again guys;

How can I consume a PHP web service from a universal application in C #?

I searched through many codes until I found this Microsoft it works very well, everything is in the MainPage.cs.

What I'm trying to do is create a separate class that consumes the web service and returns a JSON string, plus a circular progress while waiting for the end of the process.

I leave the code:

public partial class MainWindow : Window
    {
        private async void StartButton_Click(object sender, RoutedEventArgs e)
        {
            int contentLength = await AccessTheWebAsync();

            resultsTextBox.Text +=
                String.Format("\r\nLength of the downloaded string: {0}.\r\n", contentLength);
        }


        async Task<int> AccessTheWebAsync()
        { 
            HttpClient client = new HttpClient();
            Task<string> getStringTask = client.GetStringAsync("http://msdn.microsoft.com");
            DoIndependentWork();
            string urlContents = await getStringTask;
            return urlContents.Length;
        }
        void DoIndependentWork()
        {
            resultsTextBox.Text += "Working . . . . . . .\r\n";
        }
    }
    
asked by Jorny 20.04.2017 в 00:27
source

1 answer

2

Here the solution:

  • Create a class that performs the consumption to the web service asynchronously and returns a JSON string.

  • In the MainPage that JSON string is captured and parsed to read the sections of the JSON.

  • A circular progress is shown while the process does not end.

  • The only thing that would need to be implemented would be that the App "lock" until the process ends.

  • Here is the complete code.

  • MAINPAGE.XAML

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <TextBlock HorizontalAlignment="Left" Margin="37,30,0,0" TextWrapping="Wrap" Text="Usuario:" VerticalAlignment="Top"/>
        <TextBox x:Name="txtUsu" HorizontalAlignment="Left" Margin="141,23,0,0" TextWrapping="Wrap" Text="[email protected]" VerticalAlignment="Top" Width="171"/>
        <TextBlock HorizontalAlignment="Left" Margin="34,67,0,0" TextWrapping="Wrap" Text="Contraseña" VerticalAlignment="Top"/>
        <PasswordBox x:Name="txtPass" HorizontalAlignment="Left" Margin="141,67,0,0" VerticalAlignment="Top" Width="171" Password="12" />
        <Button x:Name="btnSesion" Content="Iniciar sesión" HorizontalAlignment="Left" Margin="141,121,0,0" VerticalAlignment="Top" Width="171" Click="ClickSesion"/>
        <TextBlock x:Name="lblResultado" HorizontalAlignment="Left" Height="97" Margin="10,199,0,0" TextWrapping="Wrap" Text="Resultado" VerticalAlignment="Top" Width="302"/>
    
        <ProgressRing x:Name="pbRing" IsActive="False" Height="48" Width="48" />
    </Grid>
    

    MAINPAGE.XAML.CS

    using System.Threading.Tasks;
    using Windows.Data.Json;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    
    namespace LoginPHP {
        public sealed partial class MainPage : Page    {
            zClsHTTP clsPHP;
            public MainPage()        {
                this.InitializeComponent();
                clsPHP = new zClsHTTP();
            }
    
            private async void ClickSesion(object sender, RoutedEventArgs e) {
                /*variables para almacenar secciones de JSON*/
                string CadenaJSON;
                string sCat = "", sMen = "";
                string sApe = "", sNom = "";
    
                CadenaJSON = await IniciarSesion();
    
                /*Crear objeto Json parseando CadenaJson, si alguna sección contiene un JSon Interno, este se convertirá en object*/
                JsonObject objJson = JsonObject.Parse(CadenaJSON);
                /*leer secciones del Json que son un string simple*/
                sCat = objJson["CAT"].GetString();
                sMen = objJson["MEN"].GetString();
    
                if (sCat.Equals("ERROR"))   {
                    /*Mostrar mensaje de error*/
                    lblResultado.Text = "El usuario no existe.";
                } else if(sCat.Equals("CORRECTO"))   {
                    switch (sMen)                 {
                        case "INGRESAR":
                            /*Obtener secciones del JSON interno de la sección DAT, recordemos que este es un object, 
                             * por ello se usa GetObject*/
                            sApe = objJson["DAT"].GetObject().GetNamedString("APELLIDOS");
                            sNom = objJson["DAT"].GetObject().GetNamedString("NOMBRES");
                            /*Mostrar mensaje de bienvenida*/
                            lblResultado.Text = "Bienvenido " + sApe + " " + sNom;
                            break;
                    }
                }
                /*ocultar progreso circular*/
                pbRing.IsActive = false;
            }
    
            async Task<string> IniciarSesion() {
                /*url del archivo php que recibe la peticion*/
                string url = "http://www.sitio.com/loguear.php";
                /* proceso que muestra el progreso circular mientras se espera a que la peticion devuelva un resultado*/
                Progreso();
                /*esperando respuesta*/
                string JsonPHP = await clsPHP.ConectaWeb(url, txtUsu.Text, txtPass.Password);
                /*devolver resultados*/
                return JsonPHP.ToString();
            }
            void Progreso() {
                /*mostrar progreso circular*/
                pbRing.IsActive = true;
            }
        }
    }
    

    zClsHTTP.CS

    using System.Collections.Generic;
    using System.Net.Http;
    using System.Threading.Tasks;
    
    namespace LoginPHP {
        /*Clase que permite realizar peticiones Asíncronas a una página PHP a través de HTTP Client y que devuelve una cadena JSON*/
        class zClsHTTP {
            /*Método asincrono que recibe n parámetros de tipo string*/
            public async Task<string> ConectaWeb(params string[] datos)   {
                /*crear diccionario para almacenar parámetros indicados*/
                var valores = new Dictionary<string, string>();
                /*agregar a diccionario cada valor utilizando un modelo (ENV*) el cual será recibido por la página PHP,
                 aquí no se envía datos[0] porque este tiene URL de la pagina PHP*/
                for (int i = 1; i < datos.Length; i++) {
                    valores.Add("ENV" + i.ToString(), datos[i].ToString());
                }
                /*Crear un formulario con los valores del diccionario*/
                var formulario = new FormUrlEncodedContent(valores);
                /*crear cliente para conectar a la web*/
                HttpClient Conexion = new HttpClient();
                /*enviar el formulario con método POST, al URL que está en datos[0] y esperar respuesta*/
                var respuesta = await Conexion.PostAsync(datos[0].ToString(), formulario);
                /*Leer contenido de respuesta devuelta por la pagina PHP*/
                Task<string> contenido = respuesta.Content.ReadAsStringAsync();
                string JsonPHP = await contenido;
                /*Reemplazar comillas simples por dobles, esto es exigencia de C#*/
                string JsonSharp = JsonPHP.Replace("'", "\"");
                return JsonSharp.ToString();
            }
        }
    }
    

    PHP

    <?php
        if(isset($_POST['ENV1']) and isset($_POST['ENV2'])){
            $sUsuar = $_POST['ENV1'];
            $sClave = $_POST['ENV2'];
    
            /*consulta SQL para verificiar login y su respectiva 
            verificion bla bla bla*/
    
            /*si el login es correcto envio un JSON de CORRECTO y los datos del usuario en la base de datos*/
            echo "{'CAT':'CORRECTO','MEN':'INGRESAR','DAT':{'APELLIDOS':'$sApes','NOMBRES':'$sNoms'}}";
            /*si es incorrecto, envio un JSON de Error*/
            echo "{'CAT':'ERROR','MEN':'NADA','DAT':'NADA'}";
        }
    ?>  
    
        
    answered by 20.04.2017 / 00:27
    source