HTTP: i segreti in C#

Oggi parleremo di C#, ma anche del protocollo HTTP (Hyper Text Transfer Protocol).

Come costruire un’applicazione in C# funzionante che controlli la formattazione di una richiesta HTTP?

La storia non è semplice poiché C# supporta sia la Console, le Windows Forms e la Windows Presentation Foundation (WPF) che non è alro che la finestra grafica molto simile alle Forms ma con qualcosa di differente.
Puoi scegliere quale strada delle tre seguire, le elencheremo tutte e tre:

Richiesta HTTP a Console

Partiamo subito con il primo progetto: Console

using System;
using System.Net;

namespace HTTPResponseCS
{
class Program
{
static void Main(string[] args)
{
string txtUri; //Bisogna creare una stringa che conterrà la nostra url da cercare
Console.Write(“Inserire URL: “); //Avvertire l’utente della richiesta di inserimento
txtUri = Console.ReadLine(); //Leggiamo ciò che l’utente ha inserito

//Creazione dell’istanza HttpWebResponse che fornisce le proprietà elencate sotto
using (HttpWebResponse response = (HttpWebResponse)WebRequest.CreateHttp(txtUri).GetResponse())
{
// a questo punto il programma fa tutto da solo
Console.WriteLine(response.Headers.ToString());
Console.WriteLine(“Protocollo: ” + response.ProtocolVersion.ToString());
Console.WriteLine(“Codice di stato: ” + response.StatusCode.ToString());
Console.WriteLine(“Descrizione stato: ” + response.StatusDescription);
Console.WriteLine(“Codifica contenuto: ” + response.ContentEncoding.ToString());
Console.WriteLine(“Lunghezza contenuto: ” + response.ContentLength.ToString());
Console.WriteLine(“Tipo contenuto: ” + response.ContentType);
Console.WriteLine(“Ultima modifica: ” + response.LastModified.ToLongDateString() + “\n” + response.LastModified.ToLongTimeString());
Console.WriteLine(“Server: ” + response.Server);
Console.WriteLine(“Lunghezza contenuto + header: ” + response.ContentLength.ToString() + response.Headers.Count.ToString());
}
Console.ReadKey();
//Equivale al system(“pause”); del C
}
}
}

Richiesta HTTP in Windows Forms

Secondo progetto: Windows Forms

  1. Bisogna creare la finestra grafica su cui trasferire i dati ottenuti dalla richiesta. Prima bisonga creare una textbox e rinominarla txtUri, poi creare un pulsante e come proprietà text inservi “Esegui richiesta” o quello che a voi piace di più
    Windows Forms passo 1
  2. Bisogna poi creare la parte che mostrerà all’utente cosa contiene la nostra richiesta HTTP. Come ultimo passaggio della costruzione della grafica bisogna inserire una textbox con la proprietà multiline impostata su true e la proprietà name con il nome di txtResponse. Siete ovviamente liberi di scegliere se usare una singola textbox oppure più textbox per mostrare al meglio i dati.Windows Forms passo 2
  3. Infine per far funzionare il programma basterà inserire nell’evento click del pulsante il codice C#. Eccone qui un esempio:private void button1_Click(object sender, EventArgs e)
    {
    using (HttpWebResponse response = (HttpWebResponse)WebRequest.CreateHttp(“http://” + txtUri.Text).GetResponse())
    {
    txtResponse.AppendText(response.Headers.ToString());
    txtResponse.AppendText(“Protocollo: ” + response.ProtocolVersion.ToString());
    txtResponse.AppendText(“Codice di stato: ” + response.StatusCode.ToString());
    txtResponse.AppendText(“Descrizione stato: ” + response.StatusDescription);
    txtResponse.AppendText(“Codifica contenuto: ” + response.ContentEncoding.ToString());
    txtResponse.AppendText(“Lunghezza contenuto: ” + response.ContentLength.ToString());
    txtResponse.AppendText(“Tipo contenuto: ” + response.ContentType);
    txtResponse.AppendText(“Ultima modifica: ” + response.LastModified.ToLongDateString() + “\n” + response.LastModified.ToLongTimeString());
    txtResponse.AppendText(“Server: ” + response.Server);
    txtResponse.AppendText(“Lunghezza contenuto + header: ” + response.ContentLength.ToString() + response.Headers.Count.ToString());
    }
    }
Richiesta HTTP in WPF

Secondo progetto: Windows Presentation Foundation.
È molto simile al codice delle Windows Forms, abbiamo solo aggiunto un metodo di controllo.
private void Button_Click(object sender, RoutedEventArgs e)
{
try
{
if (txtUri.Text.Contains(“http://”))
Response();
else
{
txtUri.Text = “http://” + txtUri.Text;
Response();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, “Errore”, MessageBoxButton.OK, MessageBoxImage.Warning);
}
}

Il pulsante richiama il metodo seguente:

private void Response()
{

using (HttpWebResponse response = (HttpWebResponse)WebRequest.CreateHttp(txtUri.Text).GetResponse())
{
txtRes.Text = response.Headers.ToString();
txtProtVer.Text = “Protocollo: ” + response.ProtocolVersion.ToString();
txtStatCode.Text = “Codice di stato: ” + response.StatusCode.ToString();
txtStatDesc.Text = “Descrizione stato: ” + response.StatusDescription;
txtContEnc.Text = “Codifica contenuto: ” + response.ContentEncoding.ToString();
txtContLen.Text = “Lunghezza contenuto: ” + response.ContentLength.ToString();
txtContType.Text = “Tipo contenuto: ” + response.ContentType;
txtLastModDate.Text = “Ultima modifica: ” + response.LastModified.ToLongDateString() + “\n” + response.LastModified.ToLongTimeString();
txtServer.Text = “Server: ” + response.Server;
txtDataLen.Text = “Lunghezza contenuto + header: ” + response.ContentLength.ToString() + response.Headers.Count.ToString();
}

Tutto il contenuto finisce nelle textbox create nella finestra grafica XAML:

<Window x:Class=”HTTPResponse.MainWindow”
xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”
xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”
xmlns:d=”http://schemas.microsoft.com/expression/blend/2008″
xmlns:mc=”http://schemas.openxmlformats.org/markup-compatibility/2006″
xmlns:local=”clr-namespace:HTTPResponse”
mc:Ignorable=”d”
Title=”MainWindow” Height=”470.984″ Width=”822.7″>
<Viewbox Stretch=”Uniform” StretchDirection=”Both”>
<Grid Width=”768.069″>
<Button Content=”Visualizza risposta” Click=”Button_Click” Margin=”0,10,10,0″ HorizontalAlignment=”Right” Width=”203″ Height=”28″ VerticalAlignment=”Top”/>
<TextBox x:Name=”txtUri” VerticalContentAlignment=”Center” Margin=”10,10,218,0″ Height=”28″ VerticalAlignment=”Top” />
<TextBox x:Name=”txtRes” HorizontalAlignment=”Right” Margin=”0,0,163,0″ IsReadOnly=”True” TextWrapping=”Wrap” Width=”205″ Height=”163″ VerticalAlignment=”Bottom” d:LayoutOverrides=”HorizontalAlignment”/>
<TextBox x:Name=”txtProtVer” HorizontalAlignment=”Right” Margin=”0,167,163,168″ IsReadOnly=”True” TextWrapping=”Wrap” Width=”205″ d:LayoutOverrides=”HorizontalAlignment, VerticalAlignment”/>
<TextBox x:Name=”txtStatCode” HorizontalAlignment=”Right” Height=”51″ Margin=”0,111,163,0″ IsReadOnly=”True” TextWrapping=”Wrap” VerticalAlignment=”Top” Width=”205″ d:LayoutOverrides=”HorizontalAlignment”/>
<TextBox x:Name=”txtStatDesc” HorizontalAlignment=”Right” Margin=”0,55,163,280″ IsReadOnly=”True” TextWrapping=”Wrap” Width=”205″ d:LayoutOverrides=”HorizontalAlignment”/>
<TextBox x:Name=”txtContEnc” HorizontalAlignment=”Left” Height=”51″ Margin=”143,55,0,0″ IsReadOnly=”True” TextWrapping=”Wrap” VerticalAlignment=”Top” Width=”205″/>
<TextBox x:Name=”txtContLen” HorizontalAlignment=”Left” Height=”51″ Margin=”143,111,0,0″ IsReadOnly=”True” TextWrapping=”Wrap” VerticalAlignment=”Top” Width=”205″/>
<TextBox x:Name=”txtContType” HorizontalAlignment=”Left” Height=”51″ Margin=”143,167,0,0″ IsReadOnly=”True” TextWrapping=”Wrap” VerticalAlignment=”Top” Width=”205″/>
<TextBox x:Name=”txtLastModDate” HorizontalAlignment=”Left” Height=”51″ Margin=”143,223,0,0″ IsReadOnly=”True” TextWrapping=”Wrap” VerticalAlignment=”Top” Width=”205″/>
<TextBox x:Name=”txtServer” HorizontalAlignment=”Left” Height=”51″ Margin=”143,335,0,0″ IsReadOnly=”True” TextWrapping=”Wrap” VerticalAlignment=”Top” Width=”205″/>
<TextBox x:Name=”txtDataLen” HorizontalAlignment=”Left” Height=”51″ Margin=”143,279,0,0″ IsReadOnly=”True” TextWrapping=”Wrap” VerticalAlignment=”Top” Width=”205″/>
</Grid>
</Viewbox>
</Window>
Windows Presentation Foundation

 

Se sei disponibile a fare una finestra grafica migliorata e a contribuire a progetti open-source puoi anche caricare sul sito il tuo lavoro e noi lo pubblicheremo.

Lascia un commento

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

%d blogger hanno fatto clic su Mi Piace per questo: