Documente Academic
Documente Profesional
Documente Cultură
2. Utilizați AnyObject atunci când aveți nevoie de flexibilitatea unui obiect unic sau
atunci când utilizați metode de obiectiv Objective-C și proprietăți care returnează un
rezultat untyped. AnyObject poate fi folosit ca tip de beton pentru o instanță a
oricărui tip de clasă, de tip sau de clasă. Comportamentul flexibil al protocolului
AnyObject este similar cu tipul de identificare al obiectivului C. Din acest motiv,
tipurile importate de tip Obiectiv-C utilizează frecvent AnyObject ca tip pentru
proprietăți, parametri de metodă și valori returnate.
AnyObject basically tells the compiler:
"Don't worry about this variable no need to enforce any type here let me do
whatever I want to."
3. Ios 7Cu Auto Layout, puteți defini constrângeri pentru a controla modul în care
interfața dvs. de utilizator se adaptează imediat la orice modificare de dimensiune.
Interface Builder poate crea automat toate constrângerile pentru dvs., asigurând un
set de reguli compatibile. De asemenea, aveți posibilitatea de a controla direct
constrângerile pentru a defini prioritatea exactă a fiecăruia, definirea modului în
care aplicația va funcționa pe diferite dimensiuni ale ecranului, atunci când este
rotită sau când este rulată în locații noi.
Adaptive Layout cuprinde mai multe idei și tehnici noi, în loc să fie un singur API
singular. Unele componente ale designului adaptiv includ colecții de trăsături, clase
de mărime, fonturi adaptive, Auto Layout și multe altele. În centrul său, designul
adaptiv există pentru a ajuta dezvoltatorii să creeze cu ușurință aplicații universale și
localizate
4. Modal View sunt adesea folosite pentru a avertiza că sa întâmplat ceva neașteptat,
pentru a solicita o confirmare sau pentru a oferi utilizatorilor posibilitatea de a
furniza informații suplimentare despre fluxul de lucru al aplicației.
UIViewController , UIAlertController ;
Vederea divizată vă permite să sculpați ecranul în două secțiuni și să afișați un
controler de vizualizare pe fiecare parte. Este de obicei utilizat pentru a afișa
navigația în partea stângă și o vedere detaliată în partea dreaptă.
Un controler de vizualizare a tabelului afișează informații structurate, repetabile într-
o listă verticală. Utilizați clasa UITableViewController în aplicația dvs. iOS pentru a
construi un controler de vizualizare de tabel.
UICollectionView makes adding your own custom layouts and layout transitions (like
those in the Photos app) simple to build.
1. Activity
În Android, o activitate reprezintă o fereastră care conține interfața grafică a aplicației. O
aplicație poate conține una sau mai multe activități (tipic, există măcar o activitate), scopul
acestora fiind acela de a interacționa cu utilizatorul. De obicei, o activitate implică un nivel
de procesare redus astfel încât să se asigure operarea aplicației în timp real. În cazul în care
aplicația conține mai multe activități, navigarea între acestea se realizează prin intermediul
unor intenții (eng. intents), reținându-se pe stivă ferestrele anterioare, care se găsesc în
fundal. O singură fereastră poate interacționa cu utilizatorul la un moment dat. Activitatea
care se afișează la momentul în care se lansează aplicația desemnează ferastra principală,
toate celelalte fiind accesate prin intermediul acesteia. O activitate este reprezentată prin
intermediul unei clase care extinde Activity. Toate activitățile din cadrul unei aplicații
Android trebuie să fie declarate în fișierul AndroidManifest.xml.
Se observă că pentru fiecare activitate trebuie să se precizeze clasa corespunzătoare
(derivată din Activity), distincția dintre fereastra principală și celelalte ferestre fiind realizată
prin intermediul valorilor pe care le iau elementele action și category din <intent-filter>.
Pentru activitatea principală, acțiunea va fi android.intent.action.MAIN, iar categoria
android.intent.category.LAUNCHER (în sensul că această ferastră va fi afișată în momentul în
care se accesează pictograma aplicației din meniul telefonului), în timp ce pentru celelalte
activități se vor specifica valorile android.intent.action.VIEW, respectiv
android.intent.category.DEFAULT.
Scopul unei activități este de a interacționa cu utilizatorul. Din momentul în care activitatea
apare pe ecran și până la momentul în care dispare, ea trece printr-o serie de etape,
cunoscute sub denumirea de ciclul de viață al activității.
O activity apelează view-uri. View-urile sunt create in fisiere de tip xml, in care se pastreaza
parametrii layout-ului care se va afisa pe ecranul unui dispozitiv mobil. Sublasele unui View
sunt Butoane, ListVew, ImageView,RelativeLayout,LinearLayout etc. Activity poate fi de 7
tipuri, ele toate invoca o actiune specifica.
Evenimentele activitatilor:
- TextView -> onClickListener, onTextCnahgedListener
- Button -> onClickListener
- ListView -> onItemClickListener
- editText -> onTextChangeListemer
Android are autoritate asupra proceselor care rulează și poate decide la un anumit moment să închidă un
anumit proces care poate fi chiar cel al aplicației noastre. Motivele pot varia, dar principala cauză are
legătură cu memoria care poate deveni insuficientă și este necesară eliberarea ei. În decizia de a opri un
proces, Android ia în considerare mai multe aspecte, de exemplu, dacă are sau nu componente vizibile pe
ecran.
Procesele sunt încadrate în 5 nivele de importanță. Atunci când unele procese trebuie „omorâte”, cel cu
nivelul mai mare de importanță va fi „distrus” ultimul. Pe scurt, ele sunt:
1. Foreground Process
Un proces necesar pentru ceea ce utilizatorul face la un moment dat, de exemplu un activitycare e folosit
de utilizator sau un serviciu care e legat de activitatea cu care utilizatorul interacționează.
2. Visible Process
Un proces care nu are componente vizibile pe ecran, dar este necesar pentru componentele cu care
interacționează utilizatorul, cum ar fi un proces cu un activity care nu e în față, dar are un dialog pornit în
prim-plan.
3. Service Process
Un proces care conține un serviciu și nu e esențial pentru ceea ce este afișat utilizatorului, cum ar fi un
serviciu care redă un MP3 în fundal în timp ce utilizatorul folosește alte aplicații.
4. Background Process
Un proces care conține o activitate care momentan nu e vizibilă utilizatorului. Pentru aceasta, există o listă
LRU (least recently used) care este luată în considerare în importanța unui proces.
5. Empty Process
Un proces care nu are componente active și este pornit doar din motive de caching sau pentru a îmbunătăți
timpul de start-up al unei aplicații.
Fire de execuție
Main Thread
Un proces poate avea mai multe fire de execuție. După cum am amintit mai sus, atunci când o aplicație e
pornită, un proces UNIX este creat, iar în cadrul lui – un singur thread. Acesta poartă denumirea de „main
thread”. El este extrem de important, pentru că este responsabil de interacțiunea cu utilizatorul, ca de
exemplu lansarea de evenimente spre diferite componente de UI (inclusiv partea de desenare) și este și
firul în care aplicația interacționează cu componentele de UI.
Sistemul nu va crea thread-uri diferite pentru fiecare componentă. Ce înseamnă asta? Atunci când atingem
un buton, acest thread va lansa un eveniment de touch spre componenta respectivă care va lansa metoda
responsabilă de schimbare a stării.
Fiind singurul thread responsabil de partea de UI, dacă aceasta este prea încărcată, poate avea o
performanță slabă. Tot din același motiv, acest thread trebuie ținut cât mai liber. Fiecare acțiune pe acest
thread, mai ales cele de durată, îl vor bloca și, implicit, aplicația nu va răspunde la acțiunile utilizatorului.
Un exemplu în acest sens ar fi accesul la resurse de pe internet, cum ar fi încărcarea unei poze. Dacă am
lăsa ca încărcarea ei să fie făcută în acest thread, el ar fi blocat până s-ar finaliza procesul de încărcare a
pozei. Dacă poza este mare și conexiunea slabă, acest lucru poate dura câteva zeci de secunde. A ține
interfața blocată pentru un timp atât de lung nu este acceptabil.
De aceea, există două reguli de bază care nu sunt negociabile atunci când lucrăm cu componentele de UI și
main thread-ul:
Pentru download-uri, query-uri în baze de date sau orice fel de operațiuni care nu afectează direct interfața
cu utilizatorul și care ar putea fi de durată, trebuie folosite alte thread-uri.
Orice manipulare a interfeței de utilizator trebuie făcută din main thread, nu din thread-urile secundare.
Asynchronous Task
Există multe opțiuni pentru a folosi thread-uri secundare și a decongestiona main thread-ul: thread-uri
clasice, servicii, mecanismul de broadcast & receive. Una dintre aceste opțiuni este și mecanismul
de asynchronous task. Acesta este reprezentat de clasa AsyncTask și nu este nimic altceva decât un
wrapper puternic parametrizat care oferă o serie de metode specifice pentru a ușura interacțiunea dintre
thread-ul secundar și main thread. În alți termeni, clasa AsyncTask este construită ca și o clasă ajutătoare în
jurul claselor Thread și Handler. Clasa e definită de un task care rulează pe un fir secundar în fundal și care
publică automat rezultatul spre main thread.
Pentru a crea un AsyncTask, trebuie să extindem clasa de bază AsyncTask care este definită de 3 tipuri
generice, denumite Params, Progress și Result și de 4 metode, dintre care una este obligatorie. Iată tipurile
generice:
Dacă task-ul nostru are nevoie de parametri, aici trebuie specificat tipul lor. De exemplu, dacă task-ul ar
trebui să descarce o serie de fișiere, atunci tipul parametrilor ar putea fi URL sau String.
Dacă task-ul e de durată, este bine să informăm utilizatorul despre progresul făcut. În general, vom
comunica o valoare integer sau double, care specifică cât din task a fost efectuat, dar putem folosi orice fel
de obiect dacă dorim să trimitem informații complete. În cazul exemplului de mai sus, putem trimite ori o
valoare care să reprezinte cât la sută din toate fișierele de download a fost deja descărcat sau putem returna
un obiect care să conțină și numele fișierelor deja descărcate sau progresul individual pentru fiecare fișier
în parte.
Cele 4 metode pe care le oferă AsyncTask sunt fiecare dedicate unui pas din cadrul execuției unui task.
Acestea sunt:
1. onPreExecute
Acest pas este executat înainte ca task-ul propriu-zis să înceapă execuția și este invocat în main thread. De
obicei, îl putem folosi pentru a pregăti execuția (ex: să afișăm un indicator de progres pe ecran).
2. doInBackground
Această metodă e invocată pe thread-ul de fundal imediat după onPreExecute și este metoda care execută
task-ul propriu-zis. Parametrii de intrare sunt trimiși acestei metode și ea va returna un obiect de tipul
specificat pentru rezultat. În acestă metodă, putem folosi și metodapublishProgress(Progress…), pentru a
face public progresul făcut de task.
3. onProgressUpdate
Acestă metodă este invocată atunci când facem public un progres prinpublishProgress(Progress…) și o
putem folosi pentru a actualiza un progress bar sau pentru a scrie în log-uri. Ea se va executa în paralel cu
task-ul din fundal.
4. onPostExecute
Acestă metodă este invocată pe main thread imediat ce task-ul de fundal este terminat și primește ca
parametru obiectul returnat dedoInBackground.
4. Structura intent-ului
Intent- mecanism de descriere a unei operațiuni (ex. alege fotografie, trimite scrisoare,
efectuare apel, deschide browser). Multe operațiuni în Android lucrează prin intent.
Cele mai răspândite scenariile de utilizare a intent-urilor pentru a porni o altă activitate în
aplicația proprie. Dar acesta nu este singura variantă pentru utilizarea intente-urilor. Ele pot fi
utilizate pentru a anunța pornirea unui serviciu sau activități, care sunt direcționate spre
execuția unor acțiuni sau transmiterea unor notificări, care atestă realizarea unui eveniment sau
acțiune.
Intent-urile pot fi folosite pentru translarea mesajelor prin sistem. Fiecare aplicație poate sa
înregistreze un receptor de difuzare care urmărește intente-urile și posibilitatea de a reacționa
la ele. Aceasta permite crearea aplicațiilor ca folosește modelul de evenimente, la baza căruia
stă evenimentele interne de sistem sau evenimente externe, care pot fi transmise prin programe
externe.
Android poate transmite intent-ruri pentru a anunța despre evenimentele de sistem, de
exemplu despre modificările în starea conexiunii de rețea sau in nivelul de încărcare a
bateriei. Aplicațiile de sistem în Android, așa aplicații ca efectuarea apelurilor sau controlul
SMS, înregistrează componentele, care urmăresc intente-urile declarate, de exemplu ai
primit un mesaj SMS, și sistemul reacționează corespunzător la acest eveniment .
Exemplu de cod pentru a trece de la o activitate la alta:
Intent intent = new Intent(HelloWorld.this, AboutActivity.class);
startActivity(intent);
În intent se indică numele clasei (activitate) ca al 2 parametru. Această clasă trebuie
specificată în manifest, și sistemul parcurgând acest manifest ca porni activitatea
corespunzătoare. O aplicație poate avea mai multe activități, acestea pot fi apelate, știind
numele clasei. La trecerea dintr-o activitate în alta se poate specifica și ce date ar putea fi
transmise pentru prelucrarea lor în activitatea apelată. Pentru a efectua această operațiune
se utilizează metoda put…().
Exemplu de transfer a listei de fisiere dintr-o activitate in alta:
// У первой активности
ArrayList<File> fileList = new ArrayList<File>();
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
intent.putExtra("FILES_LIST", fileList);
startActivity(intent);
// У второй активности
ArrayList<File> filelist =
(ArrayList<File>)getIntent().getSerializableExtra("FILES_LIST");
ACTION_VIEW permite vizualizarea unei pagini web, în cazul dat. Odată cu declararea
adresei (datele necesare), se efectuează pornirea unei noi activități (browser-ul). În acest
timp activitatea inițială lucrează ca activitate de fundal. În fiecare caz Android singur găsește
activitatea necesară pentru a răspunde la intent, și o inițializează în caz de necesitate.
Aplicația la fel poate crea intent-uri proprii pentru a permite altor aplicații să le apeleze.
Sistemul nu garantează prelucrarea intente-urilor.
Intent-ul conține informații care prezintă interes pentru Android, numele componentei care
trebuie să-l prelucreze intent-ul și setul de parametri pentru pornirea acestui component.
Intent-ul conține următoarele cîmpuri: ComponentName, activitatea, date (uri, mime),
categoria, etc.
Pentru a accesa informații din intent se utilizează metoda getIntent(). Dacă intent-ul este
nedefinit (ascuns) atunci poți obține informații despre URL din intent la apelarea metodelor
getAction(), getData(), getExtras().
Când creăm un intent explicit pentru a porni o activitate sau servicu, sistemul imediat va
porni componenta specificată în obiectul Intent.
Figura 1 : Are loc ilustrarea unui intent implicit și anume parcurgerea lui prin sistem pentru a
porni o altă activitate: [1] activitatea A crează un Intent cu acțiunea și o trasmite la
startActivity(). [2] sistemul android caută toate aplicațiile care corespund intentului, atunci
când aplicația necesară a fost găsită [3] sistemul startează activitate potrivită (Activity B)
invocând metoda onCreate() și transmite intent în ea.
Intent Resolution
Când sistemul recepționează intentul implicit pentru pornirea activității, el caută cea mai
bună activitate pentru inent, comparând intentul cu 3 aspecte de bază utilizând Intent
filtrul:
Acțiunea intentului
Datele intentului (ambele URI (Uniform Resource Identifier(Indentificatorul
universal al resurselor)) și tipuri de date)
Categoria intentului
Secțiunele următoare vor descrie cum intenturile se potrivesc la cea mai apropiată
compoonentă cum filtrul intentului este declarat în fișierul Manifest al aplicației.
Exemplele ce urmează, vor găsi intentul potrivit utilizând intent filtrele:
Action test
<intent-filter>
<action android:name="android.intent.action.EDIT" />
<action android:name="android.intent.action.VIEW" />
...
</intent-filter>
Category test
<intent-filter>
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
...
</intent-filter>
Data test
<intent-filter>
<data android:mimeType="video/mpeg" android:scheme="http" ... />
<data android:mimeType="audio/mpeg" android:scheme="http" ... />
...
</intent-filter>
Exemplu de intent pentru a obține datele imaginii dintr-un content provider și să le
afișeze:
<intent-filter>
<data android:mimeType="image/*" />
...
</intent-filter>
6. Android Manifest
Fișierul Manifest AndroidManifest.xml reprezintă în format xml informația de bază despre
aplicație. Fiecare aplicație trebuie să aibă acest fișier. Redactarea fișierului se poate efectua
manual, schimbând codul XML sau schimbările pot fi efectuate prin intermediul Manifest
Editor, care permite să se realizeze redactarea vizuală și textuală a fișierului în cadrul
aplicației.
Particularitățile manifestului:
- Declararea numelui pachetului java, care reprezintă un identificator unic;
- Descrierea componentelor aplicației- activități, servicii, intent, care permit să fie
apelate clase, care realizează fiecare componentă, și declară intențiile lor;
- Conține lista permisiunilor necesare pentru apelarea interacțiunilor cu alte aplicații;
- Declară permisiunile, care alte aplicații trebuie să le aibă pentru interacțiunea cu
componentele acestei aplicații;
- Declară nivelul minim API Android, necesar pentru lucrul cu aplicația;
- Enumeră biblioteci de legătură.
Structura manifestului:
Fișierul manifestului încapsulează toată arhitectura aplicației Android, funcționalitățile și
configurația acesteia. Elementele rădăcină ale manifestului reprezintă <manifest>. Alte
tag-uri importante și obligatorii sunt <application> și <uses-sdk>. Elementul <application>
reprezintă elementul de bază al manifestului care conţine multe elemente descendente,
care defines structura și lucrul aplicației. Ordinea localizării elementelor, care se află la
același nivel este arbitrar. Toate valorile se stabilesc prin atributele elementelor.
Atribute:
- xmlns:android- definește namespace pentru Android, și niciodată nu se
schimbă;
- package- defineste numele unic al pachetului aplicatiei, care este definita la
etapa de creare a aplicatiei;
- android:versionCode- indica la numarul intern al versiunii, utilizind pentru
compararea versiunii aplicației;
- android:versionName- indica numarul versiunii de utilizare.
Exemplu concret de fișier AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mark.paiip2" >
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category
android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".TwoActivity"
/>
</application>
</manifest>
7. Noțiunea de Context
Crearea obiectelor noi – este utilizată pentru a crea View-uri, adapters și listeners:
TextView tv = new TextView(getContext());
ListAdapter adapter = new
SimpleCursorAdapter(getApplicationContext(), ...);
Accesarea resurselor standarde comune – servicii ca:
LAYOUT_INFLATER_SERVICE, SharedPreferences:
context.getSystemService(LAYOUT_INFLATER_SERVICE)
getApplicationContext().getSharedPreferences(*name*, *mode*);
Accesarea implicită a componentelor – cea ce privește content providers,
intenturi și broadcasturi:
getApplicationContext().getContentResolver().query(uri, ...);
General
Odata cu C# 5.0 si .NET Framework 4.5, Microsoft a introdus in limbajul C# suport pentru
programarea asincrona prin cuvintele cheie async si await. Codul asincron starteaza o
operatie care se dasfasoara pe un termen mai lung si returneaza imediat controlul thread-
ului, fara a bloca cursul evenimentelor asteptand rezultatul operatiei. Cand operatia s-a
terminat, suntem notificati de acest lucru prin diverse mecanisme cum ar fi un event, un
delegate sau expresie lambda, await, etc. Exemple de operatii "lungi" sunt accesul la diferite
periferice, accesul la retea/internet sau diferite intarzieri datorate unor procesari de date.
Microsoft marsaluieste tare pe programarea asincrona. Astfel, in Silverlight a eliminat toate
metodele sincrone din clasele care contineau ambele perechi, sincrone si asincrone. Sub
Windows 8 si .NET Framework 4.5, au fost deasemenea introduse o serie de metode
asincrone, insa au ramas si echivalentele lor sincrone. Microsoft recomanda folosirea
metodelor asincrone pe cat posibil, deoarece prin natura ei, o aplicatie de tip Windows
Store este terminata neasteptat, daca aceasta apeleaza o metoda sincrona a carei timp de
executie este foarte lung (de ordinul zecilor de secunde).
Utilizarea perechii async/await a fost gandita astfel incat codul rezultat sa arate foarte
asemanator cu echivalentul sau sincron. In urmatorul exemplu voi prezenta o metoda care
descarca o pagina WEB si o afiseaza la consola.
private void PrintWebPage(string uri)
{
var client = new WebClient();
var page = client.DownloadString(uri);
Console.WriteLine(page);
}
Urmeaza echivalenta asincrona.
private async void PrintWebPageAsync(string uri)
{
var client = new WebClient();
var page = await client.DownloadStringTaskAsync(uri);
Console.WriteLine(page);
}
Se observa ca cele doua metode sunt foarte asemanatoare, diferenta constand in
"decorarea" celei de-a doua metode cu async si await si apelarea variantei asincrone
DownloadStringTaskAsync. Prin conventie, o metoda asincrona va contine sufixul Async.
Aparent asemanatoare, cele doua metode sunt intern complet diferite. Compilatorul C#,
cand va intalni cuvantul cheie await, va imparti metoda in doua iar tot codul de dupa await
il va introduce in ce-a de-a doua parte/metoda. Putem verifica acest aspect urmarind codul
IL rezultat.La runtime, se executa codul pana se intalneste metoda
DownloadStringTaskAsync, dupa care se incepe descarcarea paginii dar nu pe thread-ul
curent. Thread-ul curent va preda controlul actiunilor utilizator, daca e un UI thread, altfel
resursele threadului vor fi eliberate.
De mentionat, ca await poate fi folosit doar in interiorul unei metode asincrone, prefixata
de async, dupa cum se poate vedea si-n exemplul de mai sus.O metoda asincrona poate
returna doar trei tipuri de date, si anume, void, Task si Task< T> unde T poate fi orice fel de
tip de date. Alte tipuri de date nu sunt permise deoarece metodele asincrone nu blocheaza
si au asociat un mecanism de notificare la terminarea executiei metodei, care cunoaste doar
cele trei tipuri de date ca rezultat. Astfel, daca avem nevoie de o metoda care returneaza o
valoare de tip int, atunci tipul de retur al metodei asincrone ete Task< int> iar in corpul
metodei vom avea la un moment dat o declaratie de forma "return valoare_int;". Daca
avem nevoie de o metoda care nu returneaza nimic (void), atunci tipul de retur al metodei
asincrone este Task iar in corpul metodei vom avea la un moment dat o declaratie de forma
"return;" sau nimic (apelul return nu este obligatoriu).Exemplu:
private async void PrintWebPage1Async(string uri)
{
var client = new WebClient();
var page = await client.DownloadStringTaskAsync(uri);
Console.WriteLine(page);
}
10.Protocolul HTTP
Hypertext Transfer Protocol (HTTP) este metoda cea mai des utilizată pentru accesarea
informațiilor în Internet care sunt păstrate pe servere World Wide Web.
Deseori utilizatorul dorește să transmită informații speciale la website. Aici HTTP pune la dispozitie
două posibilități:
Erorile de HTTP sunt clasificate în 5 clase (categorii). Acestea sunt (pentru fiecare clasa sunt date
câteva dintre erorile conținute):
1xx - erori informaționale:
100 - contiunuă:
Utilizatorul ar trebui să își continue cererea/acțiunea. Acest răspuns provizoriu este folosit pentru a informa
utilizatorul că partea inițială a cererii a fost receptată și că deocamdată nu a fost refuzată de server.
Utilizatorul ar trebui să continue și să ignore acest răspuns.
101 - schimbare protocol.
2xx - răspuns reușit: clasa de răspuns/status ce indică utilizatorului că cererea a fost primită,
înțeleasă și acceptată cu succes.
200 - ok:
Această cerere a fost executată cu succes. Informația a revenit cu un răspuns pozitiv, indiferent de
modul în care s-a făcut cererea.
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 alți utilizatori, fără a cere
conexiunii clientului să insiste până ce procesul/cererea e completă.
3xx - redirectări:
4xx - erori ale utilizatorilor: această clasă de mesaje/statusuri este folosită în cazurile în care
utilizatorul ar putea greși formularea cererii. Excepția fiind răspunsurule pentru cererile tip
„Direcționat/condus”, atunci serverul ar trebui să conțină o intrare cu o explicație a situației erorii și
dacă e o eroare temporară sau pemanentă. Aceste răspunsuri sunt aplicabile pentru orice fel de
cerere. Browser-ele ar trebui să arate orice intrare cerută de utilizator.
400 - cerere greșită:
Cererea nu a putut fi înțeleasă/percepută de către server din cauza unei sintaxe greșite/incomplete.
Utilizatorul ar trebui să nu repete cererea fără ca aceasta să suporte modificări.
401 - neautorizat:
11. Metodele și cîmpurile prot. HTTP
Câmpuri-mărimea pachetului, cookies
METODE
Metodele disponibile sunt :
GET: este cea mai folosită metodă, fiind utilizată atunci când serverului i se cere o resursă.
HEAD: se comportă exact ca metoda GET, dar serverul returnează doar antetul resursei,
ceea ce permite clientului să inspecteze antetul resursei, fără a fi nevoit să obțină și corpul
resursei. Accesibilitatea resursei(desktop /mobile).
PUT: metoda este folosită pentru a depune documente pe server, fiind inversul metodei
GET.
POST: a fost proiectată pentru a trimite date de intrare către server.
DELETE: este opusul metodei PUT.
TRACE: este o metodă folosită de obicei pentru diagnosticare, putând da mai multe
informații despre traseul urmat de legătura HTTP, fiecare server proxy adăugându-și
semnătura în antetul Via.
OPTIONS: este folosită pentru identificarea capacităților serverului Web, înainte de a face o
cerere.
CONNECT: este o metodă folosită în general de serverele intermediare.
JSON este un acronim în limba engleză pentru JavaScript Object Notation, și este un format de
reprezentare și interschimb de date între aplicații informatice. Utilizat pentru reprezentarea
obiectelor și a altor structuri de date și este folosit în special pentru a transmite date structurate
prin rețea, procesul purtând numele de serializare.
In c# , seriaizarea are loc prin Json.NET - un popular JSon framework pentru .NET
Cea mai rapidă metodă de conversie dintre text și JSON obiect .NET utilizarea metodei
JsonSerializer.JsonSerializer convertește .NET obiecte în echivalentul lor JSON si maparea
obiect .NET, numele de proprietate la numele de proprietate JSON și copii valorile pentru
tine.
Deseralizarea reprezinta convertarea fisierului json In Obiecte.
Product product = new Product();
product.Name = "Apple";
product.ExpiryDate = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };
string output = JsonConvert.SerializeObject(product);
Product deserializedProduct =
JsonConvert.DeserializeObject<Product>(output);
class Program
{
static void Main()
{
Regex regex = new Regex(@"\d+");
Match match = regex.Match("Dot 55 Perls");
if (match.Success)
{
Console.WriteLine(match.Value);
}
}
}
Output
55