Documente Academic
Documente Profesional
Documente Cultură
Raport
Lucrare de laborator nr.3
Disciplina: Programarea n reea
Tema: Protocolul HTTP
A efectuat:
St. gr. TI-143 GainaCristin
A verificat:
Lect. asist. Ciudin S.
Chiinu 2017
Cuprins
1
HTTP protocol..................................................................................................................................3
1.3. Metode.....................................................................................................................................8
3.WebRequest i WebResponse.....................................................................................................12
4.Dispatcher....................................................................................................................................14
Concluzii.........................................................................................................................................17
Bibliografie.....................................................................................................................................18
Anexa A MainWindow...................................................................................................................19
Anexa B WebCrawling..................................................................................................................21
2
1.HTTP protocol
Hypertext Transfer Protocol (HTTP) este metoda cea mai des utilizat pentru accesarea
informaiilor n Internet care sunt pstrate pe servere World Wide Web (WWW). Protocolul HTTP este un
protocol de tip text, fiind protocolul "implicit" al WWW. Adic, dac un URL nu conine partea de
protocol, aceasta se consider ca fiind http. HTTP presupune c pe calculatorul destina ie ruleaz un
program care nelege protocolul. Fiierul trimis la destinaie poate fi un document HTML (abreviaie de
la HyperText Markup Language), un fiier grafic, de sunet, animaie sau video, de asemenea un program
executabil pe server-ul respectiv sau i un editor de text. Dup clasificarea dup modelul de referin OSI,
protocolul HTTP este un protocol de nivel aplicaie. Realizarea i evoluia sa este coordonat de ctre
World Wide Web Consortium (W3C).
1.1.Modul de funcionare
HTTP ofer o tehnic de comunicare prin care paginile web se pot transmite de la un computer
aflat la distan spre propriul computer. Dac se apeleaz un link sau o adres de web cum ar fi
http://www.example.com, atunci se cere calculatorului host s afieze o pagin web (index.html sau
altele). n prima faz numele (adresa) www.example.com este convertit de protocolul DNS ntr-o adres
IP. Urmeaz transferul prin protocolul TCP pe portul standard 80 al serverului HTTP, ca rspuns la
cererea HTTP-GET. Informaii suplimentare ca de ex. indica ii pentru browser, limba dorit .a. se pot
aduga n header-ul (antetul) pachetului HTTP. n urma cererii HTTP-GET urmeaz din partea serverului
rspunsul cu datele cerute, ca de ex.: pagini n (X)HTML, cu fiiere ataate ca imagini, fi iere de stil
(CSS), scripturi (Javascript), dar pot fi i pagini generate dinamic (SSI, JSP, PHP i ASP.NET). Dac
dintr-un anumit motiv informaiile nu pot fi transmise, atunci serverul trimite napoi un mesaj de eroare.
Modul exact de desfurare a acestei aciuni (cerere i rspuns) este stabilit n specificaiile HTTP.
1.2.Erori de HTTP
Erorile de HTTP sunt clasificate n 5 clase (categorii). Acestea sunt (pentru fiecare clasa sunt date
cteva dintre erorile coninute):
1xx - erori informaionale: aceast clas a status-ului indic un rspuns provizoriu al serverului
i conine numai linia de status (de rspuns) sau alte aplicaii opionale. Nu sunt aplicaii necesare
pentru acest clasa de rspuns/status. Aceste status-uri pot fi ignorate.
100 - contiunu:
Utilizatorul ar trebui s i continue cererea/aciunea. Acest rspuns provizoriu este folosit pentru a
3
informa utilizatorul c partea iniial a cererii a fost receptat i c deocamdat nu a fost refuzat
de server. Utilizatorul ar trebui s continue i s ignore acest rspuns.
2xx - rspuns reuit: clasa de rspuns/status ce indic utilizatorului c cererea a fost primit,
neleas i acceptat cu succes.
200 - ok:
Aceast cerere a fost executat cu succes. Informaia a revenit cu un rspuns pozitiv, indiferent de
modul n care s-a fcut cererea.
201 - creat/realizat:
Cererea a fost ndeplinit avnd ca rezultat crearea unui nou rezultat. Noul rezultat poate fi
referit/raportat de ctre URI-uile napoiate la intrarea rspunsului.
202 - acceptat:
Cererea a fost acceptata pentru procesare, dar aceasta din urm nu a fost terminat complet.
Scopul acestui mesaj este de a permite unui server s accepte cereri de la ali utilizatori, fr a cere
conexiunii clientului s insiste pn ce procesul/cererea e complet.
4
206 - coninut parial:
Serverul a ndeplinit parial cererea de primire de la surs.
3xx - redirectri: aceast clas de rspuns/status indic faptul c aciunile urmtoare vor trebui
fcute de browser pentru a putea fi ndeplinita cererea. Cererea ar putea fi direcionat de browser
fr a interaciona cu utilizatorul dac i numai dac metoda folosit n cea de a doua cerere este
Primit/recepionat sau Direcionat/condus.
302 - gsit:
Sursa cererii este temporar pe un alt URI. n cazul n care redirectarea ar putea fi schimbat
ocazional, utilizatorul ar trebui s foloseasc n continuare cererea URI (Request-URI) n cazul
unor cereri ulterioare.
Dac mesajul/statusul 302 este recepionat ca rspuns al unei cereri alta dect Primit/recepionat
sau Direcionat/condus, browser-ul nu trebuie s redirecteze automat cererea dac aceasta nu
poate fi confirmat de crte utilizator.
304 - nemodificat:
n cazul n care clientul a efectuat o cerere de tip Primit/recepionat i accesul este permis, dar
documentul nu a fost modificat, serverul ar trebui s rspund cu acest mesaj/status.
5
305 - folosete proxy:
Cererea trebuie accesat printr-un proxy dat de ctre cmpul de locaie. Acesta este dat de ctre
URI. Beneficiarul va repeta acest unic cerere prin intermediul unui proxy. Rspunsul 305 va fi
generat doar de ctre serverul de origine.
306 (nefolosit):
Acest mesaj/status a fost folosit ntr-o vesiune anterioar a specificaiilor deci nu mai este folosit,
el fiind reinut.
4xx - erori ale utilizatorilor: aceast clas de mesaje/statusuri este folosit n cazurile n care
utilizatorul ar putea grei formularea cererii. Excepia fiind rspunsurule pentru cererile tip
Direcionat/condus, atunci serverul ar trebui s conin o intrare cu o explicaie a situaiei erorii
i dac e o eroare temporar sau pemanent. Aceste rspunsuri sunt aplicabile pentru orice fel de
cerere. Browser-ele ar trebui s arate orice intrare cerut de utilizator.
401 - neautorizat:
Cererea necesit autentificarea/nregistrarea utilizatorului. Rspunsul trebuie s includ WWW -
cmp de autentificare coninnd o somaie aplicabil utilizatorului. Utilizatorul poate repeta
cererea. Dac cererea deja includea cmpul de autorizare, atunci raspunsul 401 indic faptul c
autorizarea a fost refuzat. Dac rspunsul 401 conine aceeai somaie ca rspuns principal iar
browser-ul a executat autentificarea cel puin o dat, atunci utilizatorul ar trebui s i se prezinte
intrarea dat n rspuns, din moment ce aceasta include informaii relevante.
403 - interzis:
Serverul a neles cererea, dar refuz s o ndeplineasc. Autorizarea nu ajut n nici un caz, iar
cererea nu ar mai trebui repetata.
6
404 - negsit:
Serverul nu a gsit nimic care s corespund cererii URI. Nu se dau indicaii despre condiia
temporar sau permanent.
406 - neacceptat:
Sursa identificat de cerere este capabil s genereze doar intrri care au coninut specific
neacceptat de ctre condiiile de acceptare trimise prin cerere.
501 - nendeplinit/nerecunoscut:
Server-ul nu poate suporta funcionalitatea cerut pentru a putea ndeplini cererea. Acesta este
rspunsul specific n cazurile n care server-ul nu recunoate metoda de cerere i nu e capabil s o
suporte indiferent de mijloc/resurs.
7
503 - serviciu nedisponibil:
n prezent server-ul nu poate s se ocupe de cererile trimise din cauza unei suprancrcri sau a
serviciilor de ntreinere a server-ului ce au loc n acel moment. Aceasta este o stare temporar i
n curnd va fi remediat.
1.3.Metode
1. GET: este cea mai folosit metod, fiind utilizat atunci cnd serverului i se cere o resurs.
2. HEAD: se comport exact ca metoda GET, dar serverul returneaz doar antetul resursei, ceea
ce permite clientului s inspecteze antetul resursei, fr a fi nevoit s obin i corpul resursei.
3. PUT: metoda este folosit pentru a depune documente pe server, fiind inversul metodei GET.
6. TRACE: este o metod folosit de obicei pentru diagnosticare, putnd da mai multe informa ii
despre traseul urmat de legtura HTTP, fiecare server proxy adugndu-i semntura n antetul
Via.
7. OPTIONS: este folosit pentru identificarea capacitilor serverului Web, nainte de a face o
cerere.
8
8. CONNECT: este o metod folosit n general de serverele intermediare.
1.4.Cmpurile headerului
9
2.HTML Agility Pack
HTML Agility Pack este un HTML parser agil, care construie te un DOM
citire/scriere i suport XPATH sau XSLR. n cuvinte mai simple este o librarie .Net
care permite parsarea web fiierilor (HTML, PHP sau aspx).
Putem instala libraria HTML Agility Pack prin serviciul Nuget. Este posibil de
instalat prin Package Manager Console Install-Package HtmlAgilityPack.
Dac avem deacum un document html care trebuie sa fie parsat e destul
urmtoarea:
Document.Load(directiva);
<html>
<head>
</head>
<body>
<div id="div1">
<a href="div1-a1">Link 1 inside div1</a>
<a href="div1-a2">Link 2 inside div1</a>
</div>
<a href="a3">Link 3 outside all divs</a>
10
<div id="div2">
<a href="div2-a1">Link 1 inside div2</a>
<a href="div2-a2">Link 2 inside div2</a>
</div>
</body>
</html>
Avem un document Html mai sus, de exemplu dorim tagurile a, adica toate
hyperlinkurile.
11
3.WebRequest i WebResponse
WebRequest este o clas abstract prin care se face cerere de la oare care
server prin intermediul URI. Clasa se afl n System.Net ca i WebResponse.
WebResponse este o clas n care se nscrie rspunsul de la cererea transmis
anterior.
Exemplu:
using System;
using System.IO;
using System.Net;
using System.Text;
namespace Examples.System.Net
{
public class WebRequestGetExample
12
{
public static void Main ()
{
//Crearea unei cereri spre url specificat
WebRequest request = WebRequest.Create ("http://www.google.com");
// Dac severul necesit o verificare de validare
request.Credentials = CredentialCache.DefaultCredentials;
// Primirea rspunsuilui
HttpWebResponse response = (HttpWebResponse)request.GetResponse ();
// Vizualizarea strii rspunsuilui
Console.WriteLine (response.StatusDescription);
// Primete coninutul fiierului html
Stream dataStream = response.GetResponseStream ();
// Deschide un stream pentru acces mai rapid
StreamReader reader = new StreamReader (dataStream);
// Citirea coninutului
string responseFromServer = reader.ReadToEnd ();
// Afiarea rezultatelor
Console.WriteLine (responseFromServer);
//Eradierea strimului i a rspunsului
dataStream.Close ();
response.Close ();
}
}
}
13
4.Dispatcher
Dispecerul menine o coad de elemente de lucru prioritar pentru un anumit fir. Atunci cnd un
Dispatcher este creat pe un fir, acesta devine singurul Dispecerul care poate fi asociat cu firul, chiar dac
dispecerul este oprit.
Dac ncercai s obinei CurrentDispatcher pentru firul de curent i un Dispecer nu este asociat
cu firul, va fi creat un Dispecer. Un Dispecerul este creat atunci cnd creai un DispatcherObject. Dac
creai un Dispatcher pe un fir de fundal, asigurai-v c pentru a nchide expeditorul nainte de a ie i firul.
n cazul n care un Dispatcher este oprit, acesta nu poate fi repornit.
n WPF, un DispatcherObject poate fi accesat numai de ctre dispecerul este asociat. De exemplu,
un fir de fundal nu poate actualiza coninutul unui buton, care este asociat cu Dispecerul pe firul UI.
Pentru ca firul de fundal pentru a avea acces la proprietatea Coninutul butonului, firul de fond trebuie s
delege activitatea Dispecerului asociat cu firul UI. Acest lucru se realizeaz prin utilizarea fie Invoke sau
BeginInvoke. Invocare este sincron i asincron este BeginInvoke. Se adaug opera ia la coada
dispecerului la DispatcherPriority specificat.
n cazul n care BeginInvoke este numit pe un Dispecer care a nchis, proprietatea de stare a
DispatcherOperation returnat este setat la Abandonat. Toate metodele de pe Dispecer, cu excep ia
DisableProcessing, sunt liber filetate. Obiectele care deriv din DispatcherObject au afinitate fir.
Obiectele care deriv din solidificabil sunt libere filetate atunci cnd sunt nghe ate. Pentru mai
multe informaii, consultai Obiecte solidificabil Prezentare general.
Exemplu:
//Delegat care va indica la metoda ce se va invoca
public delegate void updater(string str);
// Metoda ce se executa de firele de execuie
public void method(object link)
{
try
{
WebRequest request = WebRequest.Create((string)link);
WebResponse response = request.GetResponse();
14
this.richTextBox.Dispatcher.BeginInvoke(new updater(update), ((string)link + " ========
Status: " + ((HttpWebResponse)response).StatusCode.ToString()));
}
catch (Exception exc)
{
this.richTextBox.Dispatcher.BeginInvoke(new updater(update), ((string)link + " ========
Status: " + exc.Message));
}
}
//Metoda ce se invok n timpul executiei unui fir pentru a seta un GUI element
public void update(string linkStatus)
{
this.richTextBox.AppendText(init+ "__ "+linkStatus);
this.richTextBox.AppendText("\n");
init++;
}
15
5.Realizarea lucrrii de laborator
Mai sus este reprezentat un textbox i un richtextbox. n textbox se introduce cheia dup care
serviciul Google caut informaie, iar richtextbox afieaz adresele resurselor care conin informaia
despre cheia cutat. Pe lng adresele care sunt afiate este i starea serverului pe care ruleaz adresa
cutare.
Dup ce se introduce o cheie n textbox se tasteaz enter pentru ca programul s cere de la google
pagina cu rezultatele serviciului de cautare Google, pe care o parseaz selectnd nodurile ce reprezint
referine la adresele serverilor cu informaia despre cheia cautat. Cererea la google pentru a primi pagina
rezultat se face cu ajutorul HtmlAgilityPack prin clasa HtmlWeb vezi Anexa B.
Html Aglity Pack automat face o cerere i primete un raspuns de la Uri specificat n contructor,
dup care rspunsul este stocat n HtmlDocument, rspunsul este sub form de Html document cu noduri
vezi capitolul HtmlAgilityPack. Apoi se trece la parsarea documentului raspuns, se selecteaz nodurile ce
reprezint referin apoi imediat sunt preluate valorile din atributele href. Aa cum valoarea n href
utilizeaz serviciul google este nevoie de cutat prile de interogare la google pentru a primi url-ului
necesar care totui se conine n valoarea hrefului.
Dup toate menionate se preiau adresele la servere i se cere strile serverilor cu ajutorul
claselor din spaiul de nume System.Net i anume clasele WebReequest i WebResponse.
16
Concluzii
Lucrarea de laborator numrul trei la programarea n reea este realizat n limbajul C# utiliznd
mediul de dezvoltare Visual Studio 2015. Sarcina laboratorului este de a lucra cu protocolul HTTP i
anume de fcut un validator de adrese de verificat dac serverele sunt valide. HTTP ofer o tehnic de
comunicare prin care paginile web se pot transmite de la un computer aflat la distan spre propriul
computer. Dac se apeleaz un link sau o adres de web cum ar fi http://www.example.com, atunci se cere
calculatorului host s afieze o pagin web (index.html sau altele). Sa accesat la serviciile google de
cautare, pentru a primi o pagin cu rspunsuri dup cutare, din pagin sunt selectate toate nodurile ce
conin adresele serverelor care urmeaz de controlat la validare. Cotrolul validrii sa produs prin
WebRequest i WebResponse prin care sa fcut cereri i sa primit rspunsuri. Rspunsurile au fost stocate
ntr-o list text care afieaz adresele si validrile. Problema listei este c un element ui creat ntr-un fir
este interzis s fie modificat n alt fir (fir de orice tip). Rezolvarea este de a folosi serviciul Dispatcherului
care permite de a invoka o metod care poate modifica elemetui UI prin intermediul unui delegat vezi
Anexa A.
17
Bibliografie
18
Anexa A MainWindow
using System;
using System.Net;
using System.Threading;
using System.Windows;
using System.Windows.Input;
using WebCng;
namespace Lab_3_PR
{
public partial class MainWindow : Window
{
private static string urlToGoogleSearch = "https://www.google.com/search?num=100&q=";
private string checkLinks = "/url?q=";
public delegate void updater(string str);
int init = 0;
public MainWindow()
{
InitializeComponent();
}
private void textBox_KeyDown(object sender, KeyEventArgs e)
{
init = 0;
if (e.Key == Key.Enter)
{
richTextBox.Document.Blocks.Clear();
WebCrawling wc = new WebCrawling(urlToGoogleSearch, checkLinks, textBox.Text);
foreach (string link in wc.Links)
{
Thread th = new Thread(new ParameterizedThreadStart(method));
th.Start(link);
}
}
}
public void method(object link)
{
try
{
WebRequest request = WebRequest.Create((string)link);
WebResponse response = request.GetResponse();
this.richTextBox.Dispatcher.BeginInvoke(new updater(update), ((string)link + " ========
Status: " + ((HttpWebResponse)response).StatusCode.ToString()));
19
}
catch (Exception exc)
{
this.richTextBox.Dispatcher.BeginInvoke(new updater(update), ((string)link + " ========
Status: " + exc.Message));
}
}
public void update(string linkStatus)
{
this.richTextBox.AppendText(init+ "__ "+linkStatus);
this.richTextBox.AppendText("\n");
init++;
}
}
}
20
Anexa B WebCrawling
using HtmlAgilityPack;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WebCng
{
public class WebCrawling
{
private static string urlToGoogleSearch;
private List<string> links = new List<string>();
private string checkLinks;
public string URL { get { return urlToGoogleSearch; } set { urlToGoogleSearch = value; } }
public string SubstractSufix { get { return checkLinks; } set { checkLinks=value; } }
public List<string> Links { get { return links; } set { links = value; } }
private HtmlWeb htmlFromWeb = new HtmlWeb();
HtmlDocument htmlFromUrl;
List<HtmlNode> htmlNodeWhatContainLinks;
public WebCrawling(string urlToGoogleSearch,string substractSufix, string searchKey)
{
this.URL = urlToGoogleSearch;
this.SubstractSufix = substractSufix;
htmlFromUrl = htmlFromWeb.Load(urlToGoogleSearch + searchKey);
htmlNodeWhatContainLinks =
htmlFromUrl.DocumentNode.SelectNodes("//h3[@class='r']//a").Where(x =>
x.Attributes["href"].Value.Contains(checkLinks)).ToList();
set(htmlNodeWhatContainLinks);
}
private void set(List<HtmlNode> htmlNodeWhatContainLinks)
{
List<string> linksTemp = new List<string>();
foreach (HtmlNode LinksNode in htmlNodeWhatContainLinks)
{
linksTemp.Add(cut(LinksNode.Attributes["href"].Value, checkLinks.Length));
}
Links = linksTemp;
}
private string cut(string strtocut, int checkLinksLength)
{
21
return strtocut.Substring(checkLinksLength, strtocut.IndexOf("&sa=U") - 7);
}
}
}
22