Efetuar Post de um formulário através do VB.NET

Publicado: 15/07/2004 em IntoSpaces
Olá Pessoal!
Esse é o primeiro artigo postado aqui no The Spoke!!
Bom para quem não me conhece, eu prefiro coisas e situações não convencionais, então vou fazer esse pequeno artigo baseado numa situação que criei ontem, por favor não me entendam mal, foi por motivo de estudo eheh

Hoje mostrarei aqui um código postado ontem mesmo no Forum MSDN, é uma função para efetuar um Post com .Net utilizando a classe WebRequest.

Bom o cenário escolhido para colocar em prática o código foi o de um site de um provedor de internet do interior de São Paulo, da cidade Macaubal.
É o MacaubalNet!

Notem que existe uma Equete no site, com ela podemos escolher uma das garotas que fizeram ensaios para o site, como a mais bonita.
Tenho duas amigas que trabalham no provedor e uma delas está participando da enquete e na minha opnião é a que merece vencer ^___~.

Há algum tempo atrás eu descobri que a validação da votação é totalmente inapropriada, pois identifica um usuário que já votou apenas por um cookie gravado na máquina do mesmo, então apagando os cookies da pra votar novamente!! eheheh

Foi avisado para eles que isso acontecia, mas nada foi feito, não sei se a competição não tem muita importância, mas a questão é que continua com essa falha grave, que um desenvolvedor web iniciante deve estar ciente e TEM que bloquear.

Por acaso ontem fui ver o resultado parcial da enquete e a minha amiga, Ananda,  

não estava em primeiro lugar, então resolvi fazer uns testes para dar uma mãozinha pra ela, e esse é o nosso foco hoje, Efetuar Post de um formulário através do VB.NET.

*Foi utilizado Asp.NET para facilitar a distribuição

Antes de iniciar quero deixar explícito que não tenho intenção de prejudicar ou expor a imagem de ninguém ou de nenhuma empresa, só usei um exemplo real de uma situação que pode ocorrer e que um indivíduo mal-intencionado pode se aproveitar para prejudicar os negócios de uma empresa.

Pois bem..
O código em questão é o que promove uma requisição do tipo POST a uma página web, com ela estamos realizando um processo próximo do que o Navegar Web faz ao enviar um formulário utilizando o método POST

Notem que é bem intuitivo o código, se conhecer a Classe WebRequest ficará muito fácil de se trabalhar com ele

Public Function DoFormPost(ByVal sPostURL As String, ByVal sQueryString As String) As String

‘Post URL…

Dim myWebRequest As WebRequest = myWebRequest.Create(sPostURL)

Dim myUrlEncodedString As String = ""

‘URL Params…

myWebRequest.ContentLength = sQueryString.Length

myWebRequest.Method = "POST"

myWebRequest.ContentType = "application/x-www-form-urlencoded"

‘Encode QueryString…

Dim myByte() As Byte

Dim myChars() As Char = {ChrW(63), ChrW(61), ChrW(38)}

Dim i As Integer = 0

Dim j As Integer

While i < sQueryString.Length

j = sQueryString.IndexOfAny(myChars, i)

If j = -1 Then

myUrlEncodedString += HttpUtility.UrlEncode(sQueryString.Substring(i, sQueryString.Length – i))

Exit While

End If

myUrlEncodedString += HttpUtility.UrlEncode(sQueryString.Substring(i, j – i))

myUrlEncodedString += sQueryString.Substring(j, 1)

i = j + 1

End While

‘Convert to Byte…

myByte = System.Text.Encoding.UTF8.GetBytes(myUrlEncodedString.ToString())

myWebRequest.ContentLength = myByte.Length

‘Request…

Dim myRequestStream As Stream = myWebRequest.GetRequestStream()

myRequestStream.Write(myByte, 0, myByte.Length)

‘Response…

Dim myWebResponse As WebResponse = myWebRequest.GetResponse()

Dim myStreamReader As StreamReader = New StreamReader(myWebResponse.GetResponseStream())

Dim sResponse As String = myStreamReader.ReadToEnd()

‘Close Objects…

myRequestStream.Close()

myStreamReader.Close()

‘Return…

Return sResponse

End Function


Agora que já temos a função principal só precisamos trabalhar as chamadas dela para que possamos enviar as requisições, e nesse exemplo, de votar na enquete.
Para iniciar precisamos de um TextBox, um Button e um Label

No Evento Page_Load já fazemos uma primeira chamda à função para termos a noção correta de como está o resultado parcial.

Private

Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

‘Put user code to initialize the page here

If Not Page.IsPostBack Then

lblResult.Text = DoFormPost("http://www.macaubal.net/enquete.php?action=results&poll_ident=4&quot;, "")

End If

End SubNotem que a url passada como parâmetro é uma url usada pela estrutura do site para ler o resultado parcial, aqui não passamos nenhum parâmetro para ser transferido como campo, pois a intenção aqui é de somente ler os dados.
É claro que a função poderia ficar melhor elaborada para efetuar diferentes tipos de requisições e melhorar o desemepenho, mas nosso objeto de trabalho hoje é essa função do post então não perderemos tempo com isso.

No evento do Click no botão Adicionamos um código muito simples para efetuar uma votação em massa, notem que isso pode surtir efeitos muito prejudiciais a uma aplicação pois o nível de requisições pode tirar o servidor do ar, pode-se até ser caracterizado um DDOS aqui, então não façam pois não é legal pra ninguém isso…

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

If txtQtd.Text <> String.Empty Then

Dim ix As Integer

If txtQtd.Text >= 100 Then

ix = 100

Else

ix = txtQtd.Text

End If

Try

Dim r As String

For i As Integer = 0 To ix

r = DoFormPost("http://www.macaubal.net/enquete.php&quot;, "option_id=1&action=vote&poll_ident=4")

Next

lblResult.Text = r

Catch ex As Exception

lblResult.Text = ex.ToString()

End Try

End If

End Sub

Bem, vem que é bem simples, é feito um loop baseado no número de requisições que foi escolhido pelo usuário, e nesse loop fazemos a requisição utilizando o mesmo código do post, porém agora passamos os campos que deveriam ser enviados em forma de querystring, então notem que o processo ficou muito simplificado, agilizando a utilização da nossa função.
Quando o loop termina jogamos para o Label o resultado da requisição, mostrando a enquete como ficou após todo o processo.
Pronto é isso!

Faze um post, que às vezes é muito necessário tornou-se agora um processo muito simples, basta somente alguma configuração no método e pronto, sempre poderá integrar melhor seus aplicativos, web e desktop para fornecer melhores funcionalidades aos usuários onde os web services não chegaram ainda.

Artigo terminado, novamente quero frizar que a utilização do cenário não tem fins perjorativos à qualquer imagem, simplesmente é o estudo de um Bug que ainda não foi resolvido, para que possamos ver uma utilização real da Classe System.Net.WebRequest.

Para visualizar o exemplo em funcionamento visite http://www.shindesign.net/anandawin.aspx

Para obter os códigos-fonte acesse
http://www.shindesign.net/thespoke/pt-br/15-07-2004/anandawin.zip

Até a próxima pessoal e não se esqueçam, não façam isso, usem o post para o BEM heeh

Murilo

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s