Retrofit este un client HTTP sigur pentru aplicații Android și Java. Retrofit-ul facilitează conectarea la un serviciu Web REST prin traducerea API-ului în interfețe Java. În acest tutorial, vă vom arăta cum să utilizați una dintre cele mai populare și adesea recomandate biblioteci HTTP disponibile pentru Android.
Această bibliotecă puternică facilitează consumarea datelor JSON sau XML, care este apoi analizată în obiecte obișnuite Java vechi (POJOs). OBȚINE
, POST
, A PUNE
, PLASTURE
, și ȘTERGE
toate cererile pot fi executate.
Ca majoritatea software-urilor open source, Retrofit a fost construit pe lângă alte biblioteci și instrumente puternice. În spatele scenei, Retrofit folosește OkHttp (de la același dezvoltator) pentru a gestiona cererile de rețea. De asemenea, Retrofit nu are un convertor JSON încorporat pentru analiza de la JSON la obiecte Java. În schimb, livrează suport pentru următoarele biblioteci de conversie JSON pentru a rezolva următoarele probleme:
com.squareup.retrofit: convertor-gson
com.squareup.retrofit: convertor-jackson
com.squareup.retrofit: convertor-Moshi
Pentru tampoane de protocol, Retrofit suporta:
com.squareup.retrofit2: convertor-Protobuf
com.squareup.retrofit2: convertor fire
Și pentru XML Retrofit, suportă:
com.squareup.retrofit2: convertor-simpleframework
Dezvoltarea propriei biblioteci HTTP de tip pentru a interfața cu un API REST poate fi o adevărată durere: trebuie să rezolvați multe aspecte, cum ar fi crearea conexiunilor, memorarea în cache, reîncercarea solicitărilor nereușite, filetarea, parsarea răspunsurilor, tratarea erorilor și multe altele. Retrofit, pe de altă parte, este o bibliotecă bine planificată, documentată și testată care vă va economisi mult timp prețios și dureri de cap.
În acest tutorial, vă voi explica cum să folosiți Retrofit 2 pentru a gestiona solicitările de rețea prin construirea unei aplicații simple care va funcționa POST
cereri, A PUNE
(pentru a actualiza entitățile) și ȘTERGE
solicitări. Vă voi arăta, de asemenea, cum să vă integrați cu RxJava și cum să anulați cererile. Vom folosi API-ul oferit de JSONPlaceholder - acesta este un API REST online pentru testare și prototipuri.
Verificați postarea mea anterioară, începeți cu Retrofit 2 HTTP Client, pentru a afla cum să executați OBȚINE
solicită și cum să integreze Retrofit cu RxJava.
Activați Android Studio și creați un nou proiect cu o activitate goală numită Activitate principala
.
După crearea unui nou proiect, declarați următoarele dependențe în dvs. build.gradle
. Dependențele includ biblioteca Retrofit și, de asemenea, biblioteca Gson a Google pentru a converti JSON în POJO (obiecte obișnuite de Java), precum și integrarea lui Gson în Retrofit.
// Retrofit compile 'com.squareup.retrofit2: modernizare: 2.1.0' // JSON Parsing compile 'com.google.code.gson: gson: 2.6.1' compilați com.squareup.retrofit2: convertor-gson: 2.1 .0'
Asigurați-vă că vă sincronizați proiectul după adăugarea dependențelor.
Pentru a efectua operațiuni de rețea, trebuie să includeți INTERNET
permisiune în manifestarea cererii: AndroidManifest.xml.
Vom crea automat modele din datele de răspuns JSON utilizând un instrument foarte util: jsonschema2pojo. Am dori să facem un lucru POST
(creați o nouă resursă) pe API. Dar, înainte de a executa această solicitare, trebuie să cunoaștem răspunsul JSON pe care trebuie să ne așteptăm atunci când este executat cu succes, astfel încât Retrofit să poată parsa răspunsul JSON și să-l deserializeze în obiecte Java. Potrivit API, dacă trimitem următoarele date într-un POST
cerere:
date: title: 'foo', corp: 'bar', userId: 1
Ar trebui să obținem următorul răspuns:
"title": "foo", "corp": "bar", "userId": 1, "id": 101
Mapați datele JSON către Java
Copiați datele de răspuns ale eșantionului din secțiunea anterioară. Acum vizitați jsonschema2pojo și inserați răspunsul JSON în caseta de introducere. Selectați tipul de sursă din JSON, stilul de adnotare al Gson, debifează Permiteți proprietăți suplimentare, și schimbați numele clasei Exemplu la Post.
Apoi faceți clic pe previzualizare pentru a genera obiectele Java.
S-ar putea să te întrebi ce @SerializedName
și @Expune
adnotările fac în acest cod generat! Nu-ți face griji, o să explic totul!
@SerializedName
este necesară adnotarea pentru ca Gson să hartă tastele JSON în câmpurile de obiecte Java.
@SerializedName ("userId") @Expose private UserId;
În acest caz, tasta JSON numele de utilizator
este mapat în câmpul de clasă numele de utilizator
. Dar rețineți că, din moment ce acestea sunt la fel, nu este necesar să includeți @SerializedName
adnotări pe teren deoarece Gson o va cartografia automat pentru noi.
@Expune
adnotarea indică faptul că membrul clasei ar trebui să fie expus pentru serializare sau deserializare JSON.
Acum, să revenim la Android Studio. Creați un nou sub-pachet în interiorul principal
pachet și numele acestuia date
. În interiorul pachetului nou creat, creați un alt pachet și denumiți-l model
. În interiorul acestui pachet, creați o nouă clasă Java și denumiți-o Post
. Acum copiați Post
clasa care a fost generată de jsonschema2pojo și inserați-o în interiorul Post
clasa pe care ați creat-o.
pachet com.chikeandroid.retrofittutorial2.data.model; importați com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Post @SerializedName ("title") @ Expune titlul de String privat; @SerializedName ("body") @ Expune corpul String privat; @SerializedName ("userId") @Expose private UserId; @SerializedName ("id") @Expunde id intreg; public String getTitle () return title; public void setTitle (titlu șir) this.title = title; public String getBody () retur; public void setBody (Corp String) this.body = corp; Integer public getUserId () return userId; public void setUserId (Integer userId) this.userId = userId; Integer public getId () return id; public void setId (ID întreg) this.id = id; @Override public String toString () return "Post " + "title = '+ + + +', + body +" + ", userId =" + userId + ", / posts) @ CallFormUrlEncoded CallsavePost (@Field ("title") Titlu șir, @Field ("body") Corp String, @Field ("userId") long userId);
Privind la APIService
clasa, avem o metodă numită savePost ()
. Pe partea de sus a metodei este @POST
adnotare, ceea ce indică faptul că vrem să executăm o POST
solicitați când este apelată această metodă. Valoarea argumentului pentru @POST
adnotarea este punctul final - care este / posturi
. Deci, adresa URL completă va fi http://jsonplaceholder.typicode.com/posts.
Bine, deci cum rămâne cu @FormUrlEncoded
? Aceasta va indica faptul că cererea va avea tipul MIME (un câmp de antet care identifică formatul corpului unei solicitări sau răspuns HTTP) setat la application / x-www-form-urlencoded
și de asemenea că numele și valorile câmpurilor sale vor fi codate UTF-8 înainte de a fi codate URI. @Field ( "cheie")
adnotarea cu numele parametrului trebuie să se potrivească cu numele pe care API îl așteaptă. Retrofit convertește implicit valorile în șiruri folosind String.valueOf (Object)
, iar corzile sunt apoi codificate prin URL. nul
valorile sunt ignorate.
De exemplu, apelarea APIService.savePost ("Vizita mea în Lagos", "Am vizitat ...", 2)
produce un organism de cerere title = My + Vizitează + Pentru a + Lagos & body = I + a vizitat ... & userId = 2
.
@Corp
AdnotarePutem folosi, de asemenea, @Corp
adnotarea unui parametru al metodei de serviciu în loc de a specifica un corp de solicitare în formă de formă cu un număr de câmpuri individuale. Obiectul va fi serializat folosind Retrofit
instanță convertizor
specificate în timpul creării. Acest lucru este utilizat numai atunci când efectuați fie a POST
sau A PUNE
operație.
@POST ("/ posts") @FormUrlConectarea apeluluisavePost (@ Postare Post Post);
Vom crea o clasă de utilități. Deci, creați o clasă în data.remote
și numește-o ApiUtils
. Această clasă va avea adresa URL de bază ca variabilă statică și va furniza și APIService
interfață cu un a getAPIService ()
metodă statică pentru restul aplicației noastre.
pachet com.chikeandroid.retrofittutorial2.data.remote; clasa publică ApiUtils private ApiUtils () public static final String BASE_URL = "http://jsonplaceholder.typicode.com/"; serviciul static public APIService getAPIService () return RetrofitClient.getClient (BASE_URL) .create (APIService.class);
Asigurați-vă că ați terminat URL-ul de bază cu a /
.
Fișierul activity_main.xml este aspectul pentru noi Activitate principala
. Acest aspect va avea un câmp de editare a textului pentru titlul postului și altul pentru corpul postului. Acesta include, de asemenea, un buton pentru a trimite postul la API.
În onCreate ()
metoda în Activitate principala
, inițializăm o instanță a APIService
(linia 14). De asemenea inițializăm Editează textul
câmpuri și un buton de trimitere care va apela sendPost ()
când faceți clic (linia 22).
private TextView mResponseTv; serviciul APIService privat APIS; @Override protejate void onCreate (Bundle savedInstanceState) super.onCreate (savedInstanceState); setContentView (R.layout.activity_main); finală EditText titleEt = (EditText) findViewById (R.id.et_title); finală EditText bodyEt = (EditText) findViewById (R.id.et_body); Buton submitBtn = (buton) findViewById (R.id.btn_submit); mResponseTv = (TextView) findViewById (R.id.tv_response); mAPIService = ApiUtils.getAPIService (); submitBtn.setOnClickListener (noul View.OnClickListener () @Override public void onClick (vizualizare Vizualizare) String title = titleEt.getText () toString () trim () String body = bodyEt.getText .trim (); if (! TextUtils.isEmpty (title) &&! TextUtils.isEmpty (corp)) sendPost (titlu, corp););
În sendPost (String, String)
metodă în Activitate principala
am trecut în titlul și corpul postului la această metodă. Ceea ce va face această metodă este numirea metodei interfeței de servicii API savePost (String, String)
a căror sarcină este de a executa o POST
solicitați trimiterea titlului și a organismului la API. showResponse (răspuns de coardă)
metoda va afișa răspunsul pe ecran.
public void sendPost (Titlu șir, Corp String) mAPIService.savePost (title, body, 1) .enqueue (new Callback() @Override public void onResponse (Apel apel, răspuns răspuns) if (answer.isSuccessful ()) showResponse (răspuns.body (). toString ()); Log.i (TAG, "postat la API" + răspuns.body (). ToString ()); @Override public void onFailure (Apel apel, Throwable t) Log.e (TAG, "Nu se poate trimite mesajul către API."); ); public void showResponse (răspunsul șirului) if (mResponseTv.getVisibility () == View.GONE) mResponseTv.setVisibility (View.VISIBLE); mResponseTv.setText (răspuns);
Al nostru APIService
instanță mAPIService
metodă savePost (String, String)
va returna a Apel
care are o metodă numită Puneți în coadă (Callback
.
Puneți în coadă ()
Puneți în coadă ()
asynchronously trimite cererea și notifică aplicația dvs. cu un apel invers atunci când un răspuns vine înapoi. Deoarece această cerere este asincronă, Retrofit se ocupă de execuția pe un fir de fundal, astfel încât firul principal al UI nu este blocat sau interferat cu.
Pentru a utiliza Puneți în coadă ()
, trebuie să implementați două metode de apel invers: onResponse ()
și onFailure ()
. Numai una dintre aceste metode va fi apelată ca răspuns la o cerere dată.
onResponse ()
: invocat pentru un răspuns HTTP primit. Această metodă este solicitată pentru un răspuns care poate fi gestionat corect, chiar dacă serverul returnează un mesaj de eroare. Deci, dacă primiți un cod de stare de 404 sau 500, această metodă va fi în continuare apelată. Pentru a obține codul de stare pentru a putea face față situațiilor bazate pe acestea, puteți folosi metoda response.code ()
. De asemenea, puteți utiliza funcția este de succes()
pentru a afla dacă codul de stare este în intervalul 200-300, indicând succesul.onFailure ()
: invocată atunci când a apărut o excepție de rețea care a comunicat serverului sau când a apărut o excepție neașteptată care gestiona solicitarea sau procesarea răspunsului.Pentru a efectua o cerere sincronă, puteți utiliza funcția a executa()
metoda într-un Apel
instanță. Dar țineți cont de faptul că metodele sincrone pe firul principal / UI vor bloca orice acțiune a utilizatorului. Deci, nu executați metode sincrone pe firul principal al Android / UI! În schimb, rulați-le pe un fir de fundal.
RxJava a fost integrat în Retrofit 1 în mod implicit, dar în Retrofit 2 trebuie să includeți unele dependențe suplimentare. Retrofitează navele cu un adaptor implicit pentru execuție Apel
instanțe. Deci, puteți schimba mecanismul de execuție al Retrofit pentru a include RxJava prin includerea RxJava CallAdapter
. Acestea sunt pașii:
Adăugați dependențele.
compilați 'io.reactivex: rxjava: 1.1.6' compilați 'io.reactivex: rxandroid: 1.2.1' compile 'com.squareup.retrofit2: adapter-rxjava: 2.1.0'
Adăugați noul CallAdapter RxJavaCallAdapterFactory.create ()
atunci când construim o instanță Retrofit (linia 5).
public static Retrofit getClient (String baseUrl) if (retrofit == null) retrofit = nou Retrofit.Builder () .baseUrl (baseUrl) .addCallAdapterFactory (RxJavaCallAdapterFactory.create ()) .addConverterFactory (GsonConverterFactory.create (); retrofit retur;
Actualizați APIService
savePost (Titlu șir, Corp String, String userId)
metodă de a deveni un observator.
@POST ("/ posts") @FormUrlEncoded ObservablesavePost (@Field ("title") Titlu șir, @Field ("body") Corp String, @Field ("userId") long userId);
Când facem cererile, abonatul nostru anonim răspunde la fluxul observabil care emite evenimente, în cazul nostru Post
. onNext
metoda este apoi apelată atunci când abonatul nostru primește orice eveniment, care apoi este transmis către noi showResponse (răspuns de coardă)
metodă.
public void sendPost (Titlu șir, Corp String) // RxJava mAPIService.savePost (titlu, corp, 1) .subscribeOn (Schedulers.io ()) observeOn (AndroidSchedulers.mainThread ()) .subscribe() @Override public void onCompleted () @Overide public void peError (Throwable e) @Overide public void onNext (Postare) showResponse (post.toString ()); );
Verificați începutul cu ReactiveX pe Android de Ashraff Hathibelagal pentru a afla mai multe despre RxJava și RxAndroid.
În acest moment, puteți rula aplicația și faceți clic pe butonul Trimiteți când ați introdus un titlu și un corp. Răspunsul API va apărea sub butonul de trimitere.
Acum, că știm cum să executăm a POST
cereți, să vedem cum putem executa o A PUNE
cereți care actualizează entitățile. Adăugați următoarea metodă nouă la APIService
clasă.
@PUT ("/ posts / id") @FormUrlEncoded CallupdatePost (@Path ("id") id lung, @Field ("title") Titlu rând, @Field ("body") Body string, @Field ("userId") long userId);
Pentru a actualiza o postare din API, avem punctul final / Mesaje / id
cu Id
fiind un substituent pentru id-ul postului pe care dorim să îl actualizăm. @Cale
adnotarea este înlocuirea numită într-un segment al căii URL Id
. Rețineți că valorile sunt convertite în șir folosind String.valueOf (Object)
și URL-ul codificat. Dacă valoarea este deja codată, puteți dezactiva codarea URL-ului astfel: @Path (valoare = "nume", codificat = adevărat)
.
Să vedem, de asemenea, cum să executăm a ȘTERGE
cerere. Folosind API-ul JSONPlaceholder, pentru a șterge o resursă post, obiectivul final este / Mesaje / id
cu metoda HTTP ȘTERGE
. Înapoi la noi APIService
interfață, trebuie doar să includem metoda deletePost ()
care o va executa. Transmitem id-ul postului la metodă și este înlocuit în segmentul căii URL Id
.
@DELETE ("/ posts / id") ApelațideletePost (@ id de lungă durată ("id"));
Să presupunem că doriți să oferiți utilizatorilor posibilitatea de a anula sau de a întrerupe o cerere. Acest lucru este foarte ușor de făcut în Retrofit. Retrofitul Apel
clasa are o metodă numită Anulare()
care va face exact acest lucru (linia 32 de mai jos). Această metodă va declanșa onFailure ()
în apelul de apel.
Această metodă poate fi apelată, de exemplu, dacă nu există o conexiune la internet sau când a apărut o excepție neașteptată, creând cererea sau tratând răspunsul. Deci, pentru a afla dacă cererea a fost anulată, utilizați metoda isCanceled ()
în Apel
clasa (linia 20).
apel privatmCall; ... public sendPost (Titlu șir, Corp String) mCall = mAPIService.savePost (titlu, corp, 1); mCall.enqueue (nou apel () @Override public void onResponse (Apel apel, răspuns răspuns) if (answer.isSuccessful ()) showResponse (răspuns.body (). toString ()); Log.i (TAG, "postat la API" + răspuns.body (). ToString ()); @Override public void onFailure (Apel apel, Throwable t) if (call.isCanceled ()) Log.e (TAG, "cererea a fost anulată"); altceva Log.e (TAG, "Nu se poate trimite mesajul la API."); showErrorMessage (); ); void public cancelRequest () mCall.cancel ();
În acest tutorial, ați aflat despre Retrofit: de ce ar trebui să o utilizați și cum să o integrați în proiectul dvs. pentru a efectua POST
, A PUNE
, ȘTERGE
și anulați cererile. De asemenea, ați învățat cum să integrați RxJava cu el. În următoarea mea postare în utilizarea Retrofit, vă voi arăta cum să încărcați fișiere.
Pentru a afla mai multe despre Retrofit, consultați documentația oficială. Și verificați câteva dintre celelalte tutoriale și cursuri despre dezvoltarea Android aici la Envato Tuts+!