locked
WebClient Method "POST" não envia os valores para PHP RRS feed

  • Pergunta

  • Olá pessoal!

    Passei o dia lutando aqui com um código e não consegui achar uma solução, vamos lá:

    Preciso enviar via POST o usuário e senha, e recebe-los no PHP, estou tentando fazer uma forma de login, para retornar um XML com os dados do usuário.

    MainPage.xaml

    (...)
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <Button Content="Logar" Height="99" HorizontalAlignment="Left" Margin="6,145,0,0" Name="btnLogIn" VerticalAlignment="Top" Width="200" Click="BtnLogInClick" />
                <TextBlock Height="30" HorizontalAlignment="Left" Margin="21,29,0,0" Name="textBlock1" Text="Usuário:" VerticalAlignment="Top" />
                <TextBox Height="72" HorizontalAlignment="Left" Margin="134,6,0,0" Name="tbUserName" Text="test" VerticalAlignment="Top" Width="334" />
                <TextBlock Height="30" HorizontalAlignment="Left" Margin="21,90,0,0" Name="textBlock2" Text="Senha:" VerticalAlignment="Top" />
                <PasswordBox Height="72" HorizontalAlignment="Left" Margin="134,67,0,0" Name="pbPassword" VerticalAlignment="Top" Width="334" Password="test" />
                <TextBlock Height="348" HorizontalAlignment="Left" Margin="21,250,0,0" Name="tbStatus" Text="Resultado : " VerticalAlignment="Top" Width="447" FontSize="36" TextWrapping="Wrap" />
            </Grid>
    (...)
    


    MainPage.xaml.cs

    private void BtnLogInClick(object sender, RoutedEventArgs e)
    {
    
       var client = new WebClient();
       client.UploadStringCompleted += (send, args) =>
                    {
                        MessageBox.Show( args.Error == null ? args.Result : args.Error.Message);
                    };
       client.Headers["Content-Type"] = "application/x-www-form-urlencoded";
       client.Encoding = Encoding.UTF8;
    
       client.UploadStringAsync(new Uri("http://localhost/autenticacaohttp"), "POST", "user="+tbUserName.Text+"&pass="+pbPassword.Password); 
    }
    

    Aparentemente deveria ser esse o código, mas do lado do PHP o valor do POST vem vazio.

    http://localhost/autenticacaohttp/

    <?php
    if ( isset($_POST['user']) ) {
        $user = $_POST['user'];
    }else{
        $user = 'vazio';
    }
    echo $user;
    exit;
    ?>
    


    Alguém poderia ajudar, ou informa a melhor maneira de fazer uma autenticação para retornar um XML, uma especie de RSS autenticado.

    Obs. via GET eu consegui receber os dados do lado do PHP


    Cleyton Ferrari
    sexta-feira, 14 de outubro de 2011 23:20

Respostas

  • Olá, pessoal só agora de manhã sobrou tempo para continuar brincando com o WP7, descobri o problema, é que a new Uri("http://localhost/autenticacaohttp") tem que terminar com a '/' assim new Uri("http://localhost/autenticacaohttp/") pronto problema resolvido!

    Legal isso né! o cara passa o dia inteiro apanhando por causa de uma barra no final da URL ahah, 

    Para ajudar quem chegar neste post via busca na internet, aqui vai o código completo com exemplo de GET e POST com WP7 para o PHP.

    MainPage.xaml

    (...)
    <!--ContentPanel - place additional content here-->
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <Button Content="Logar" Height="99" HorizontalAlignment="Left" Margin="6,145,0,0" Name="btnLogIn"
                        VerticalAlignment="Top" Width="200" Click="BtnLogInClick" />
                <TextBlock Height="30" HorizontalAlignment="Left" Margin="21,29,0,0" Name="textBlock1" 
                           Text="Usuário:" VerticalAlignment="Top" />
                <TextBox Height="72" HorizontalAlignment="Left" Margin="134,6,0,0" Name="tbUserName" 
                         Text="test" VerticalAlignment="Top" Width="334" />
                <TextBlock Height="30" HorizontalAlignment="Left" Margin="21,90,0,0" Name="textBlock2"
                           Text="Senha:" VerticalAlignment="Top" />
                <PasswordBox Height="72" HorizontalAlignment="Left" Margin="134,67,0,0" Name="pbPassword"
                             VerticalAlignment="Top" Width="334" Password="test" />
                <TextBlock Height="348" HorizontalAlignment="Left" Margin="21,250,0,0" Name="tbStatus" 
                           Text="Resultado : " VerticalAlignment="Top" Width="447" FontSize="36" TextWrapping="Wrap" />
            </Grid>
    (...)
    

     

    MainPage.xaml.cs

    private void BtnLogInClick(object sender, RoutedEventArgs e)
    {
                #region Metodo GET
                //var client = new WebClient();
    
                //var user = string.Format("{0}", HttpUtility.UrlEncode(tbUserName.Text));
                //var pass = string.Format("{0}", HttpUtility.UrlEncode(pbPassword.Password));
                //var url = string.Format("http://wp7.net/?user={0}&pass={1}", user, pass);
    
                //client.DownloadStringCompleted += (o, args) =>
                //{
                //    if (args.Error == null)
                //        tbStatus.Text = "GET: "+ args.Result;
                //    else
                //        tbStatus.Text = args.Error.Message;
                //};
    
                //client.DownloadStringAsync(new Uri(url, UriKind.Absolute));
                #endregion
    
                #region Metodo POST
                var client = new WebClient();
                client.UploadStringCompleted += (send, args) =>
                {
                    tbStatus.Text = "POST: " + (args.Error == null ? args.Result : args.Error.Message);
                };
                client.Headers["Content-Type"] = "application/x-www-form-urlencoded";
                client.Encoding = Encoding.UTF8;
    
                client.UploadStringAsync(
                    new Uri("http://wp7.net/"),
                    "POST",
                    "user=" + HttpUtility.UrlEncode(tbUserName.Text) +
                    "&pass=" + HttpUtility.UrlEncode(pbPassword.Password)); 
             
                #endregion
    }
    

     

    E agora a parte do PHP, eu usei um virtual host com url (wp7.net) mas você pode usar o (http://localhost/url/), só não esquece da bendita '/' no final da url, ou do nome do arquivo (http://localhost/url/index.php)

    <?php
    $user = '';
    $pass = '';
    if (isset($_POST['user']) && isset($_POST['pass'])) {
        $user = urldecode($_POST['user']);
        $pass = urldecode($_POST['pass']);
    } else if (isset($_GET['user']) && isset($_GET['pass'])) {
        $user = urldecode($_GET['user']);
        $pass = urldecode($_GET['pass']);
    }
    
    echo $user . ' ' . $pass;
    exit;
    ?>
    


    Segui as dicas do Andre Carlucci, e acrescentei o UrlEncode, e só para registro, eu não conhecia o Fiddler, mas instalei ele e funciou legal aqui sem muito trabalho só tive que configurar uma opção lá e pronto! http://blogs.msdn.com/b/fiddler/archive/2010/10/15/fiddler-and-the-windows-phone-emulator.aspx?wa=wsignin1.0 

    Obrigado ai pessoal, pelas dicas! e até a próxima!

     


    Cleyton Ferrari
    • Marcado como Resposta Cleyton Ferrari quarta-feira, 19 de outubro de 2011 15:41
    quarta-feira, 19 de outubro de 2011 15:40

Todas as Respostas

  • Apesar de não o ter experimentado, o código parece-me correcto...

    Faz o seguinte teste: instala e abre o Fiddler, depois abre o emulador e executa o código para veres no Fiddler o pedido que está a ser executado!

    Pode ser que por aí chegues ao problema!


    Pedro Lamas
    DevScope | Senior Solution Developer & WP7 Development Speaker
    www.pedrolamas.com | @pedrolamas
    sábado, 15 de outubro de 2011 18:01
  • Olá Cleyton,

    É um tiro no escuro, mas talvez o conteúdo do "user" ou da "senha" esteja bagunçado o request.

    Tente aplicar HttpUtility.UrlEncode(tbUserName.Text) no user e na senha para garantir que vai tudo certo.

    Outra coisa é setar o cabeçado de ContentLenght, o webserver agradece :)

    client.Headers[HttpRequestHeader.ContentLength] = postData.Length.ToString();
    
    

    Ah, o fiddler não funciona diretamente com o emulador do wp7 (maldição), mas sei existem workarounds pra isso por aí.

    []'s!

    André


    - André Carlucci - Way2 Technology - twitter/andrecarlucci - andrecarlucci.com
    segunda-feira, 17 de outubro de 2011 18:58
  • velho, ta usando a última versão do sdk?

     

    Esta semana eu tive um problema parecido que só resolveu depois de eu atualizar o sdk

     

    segunda-feira, 17 de outubro de 2011 23:20
  • Ah, o fiddler não funciona diretamente com o emulador do wp7 (maldição), mas sei existem workarounds pra isso por aí.

    Ora viva André,

    Penso que não deves ter a última versão do SDK ou do Fiddler, dado que actualmente, funciona um com o outro lindamente e sem precisarmos de truques! ;)

    Não tenho a certeza e teria que validar, mas tenho a ideia que o header ContentLength já é colocado automaticamente pelo WebClient (ao passo que o WebRequest, teria que ser colocado manualmente!)


    Pedro Lamas
    DevScope | Senior Solution Developer & WP7 Development Speaker
    www.pedrolamas.com | @pedrolamas
    segunda-feira, 17 de outubro de 2011 23:36
  • Olá, pessoal só agora de manhã sobrou tempo para continuar brincando com o WP7, descobri o problema, é que a new Uri("http://localhost/autenticacaohttp") tem que terminar com a '/' assim new Uri("http://localhost/autenticacaohttp/") pronto problema resolvido!

    Legal isso né! o cara passa o dia inteiro apanhando por causa de uma barra no final da URL ahah, 

    Para ajudar quem chegar neste post via busca na internet, aqui vai o código completo com exemplo de GET e POST com WP7 para o PHP.

    MainPage.xaml

    (...)
    <!--ContentPanel - place additional content here-->
            <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
                <Button Content="Logar" Height="99" HorizontalAlignment="Left" Margin="6,145,0,0" Name="btnLogIn"
                        VerticalAlignment="Top" Width="200" Click="BtnLogInClick" />
                <TextBlock Height="30" HorizontalAlignment="Left" Margin="21,29,0,0" Name="textBlock1" 
                           Text="Usuário:" VerticalAlignment="Top" />
                <TextBox Height="72" HorizontalAlignment="Left" Margin="134,6,0,0" Name="tbUserName" 
                         Text="test" VerticalAlignment="Top" Width="334" />
                <TextBlock Height="30" HorizontalAlignment="Left" Margin="21,90,0,0" Name="textBlock2"
                           Text="Senha:" VerticalAlignment="Top" />
                <PasswordBox Height="72" HorizontalAlignment="Left" Margin="134,67,0,0" Name="pbPassword"
                             VerticalAlignment="Top" Width="334" Password="test" />
                <TextBlock Height="348" HorizontalAlignment="Left" Margin="21,250,0,0" Name="tbStatus" 
                           Text="Resultado : " VerticalAlignment="Top" Width="447" FontSize="36" TextWrapping="Wrap" />
            </Grid>
    (...)
    

     

    MainPage.xaml.cs

    private void BtnLogInClick(object sender, RoutedEventArgs e)
    {
                #region Metodo GET
                //var client = new WebClient();
    
                //var user = string.Format("{0}", HttpUtility.UrlEncode(tbUserName.Text));
                //var pass = string.Format("{0}", HttpUtility.UrlEncode(pbPassword.Password));
                //var url = string.Format("http://wp7.net/?user={0}&pass={1}", user, pass);
    
                //client.DownloadStringCompleted += (o, args) =>
                //{
                //    if (args.Error == null)
                //        tbStatus.Text = "GET: "+ args.Result;
                //    else
                //        tbStatus.Text = args.Error.Message;
                //};
    
                //client.DownloadStringAsync(new Uri(url, UriKind.Absolute));
                #endregion
    
                #region Metodo POST
                var client = new WebClient();
                client.UploadStringCompleted += (send, args) =>
                {
                    tbStatus.Text = "POST: " + (args.Error == null ? args.Result : args.Error.Message);
                };
                client.Headers["Content-Type"] = "application/x-www-form-urlencoded";
                client.Encoding = Encoding.UTF8;
    
                client.UploadStringAsync(
                    new Uri("http://wp7.net/"),
                    "POST",
                    "user=" + HttpUtility.UrlEncode(tbUserName.Text) +
                    "&pass=" + HttpUtility.UrlEncode(pbPassword.Password)); 
             
                #endregion
    }
    

     

    E agora a parte do PHP, eu usei um virtual host com url (wp7.net) mas você pode usar o (http://localhost/url/), só não esquece da bendita '/' no final da url, ou do nome do arquivo (http://localhost/url/index.php)

    <?php
    $user = '';
    $pass = '';
    if (isset($_POST['user']) && isset($_POST['pass'])) {
        $user = urldecode($_POST['user']);
        $pass = urldecode($_POST['pass']);
    } else if (isset($_GET['user']) && isset($_GET['pass'])) {
        $user = urldecode($_GET['user']);
        $pass = urldecode($_GET['pass']);
    }
    
    echo $user . ' ' . $pass;
    exit;
    ?>
    


    Segui as dicas do Andre Carlucci, e acrescentei o UrlEncode, e só para registro, eu não conhecia o Fiddler, mas instalei ele e funciou legal aqui sem muito trabalho só tive que configurar uma opção lá e pronto! http://blogs.msdn.com/b/fiddler/archive/2010/10/15/fiddler-and-the-windows-phone-emulator.aspx?wa=wsignin1.0 

    Obrigado ai pessoal, pelas dicas! e até a próxima!

     


    Cleyton Ferrari
    • Marcado como Resposta Cleyton Ferrari quarta-feira, 19 de outubro de 2011 15:41
    quarta-feira, 19 de outubro de 2011 15:40
  • Segui as dicas do Andre Carlucci, e acrescentei o UrlEncode, e só para registro, eu não conhecia o Fiddler, mas instalei ele e funciou legal aqui sem muito trabalho só tive que configurar uma opção lá e pronto! http://blogs.msdn.com/b/fiddler/archive/2010/10/15/fiddler-and-the-windows-phone-emulator.aspx?wa=wsignin1.0

    Viva André,

    Ainda bem que o problema ficou resolvido! ;)

    Só uma pequena correcção: esse post é já bastante antigo, e nas versões actuais do Fiddler já não é necessário alterar essa opção (penso que vem mesmo por omissão com esse valor)


    Pedro Lamas
    DevScope | Senior Solution Developer & WP7 Development Speaker
    www.pedrolamas.com | @pedrolamas
    quarta-feira, 19 de outubro de 2011 15:46