Trimiterea datelor cu Retrofit 2 Client HTTP pentru Android

Ce veți crea

Ce este Retrofit?

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ȚINEPOSTA PUNEPLASTURE, ș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:

  • Gson: com.squareup.retrofit: convertor-gson
  • Jackson: com.squareup.retrofit: convertor-jackson
  • Moshi: com.squareup.retrofit: convertor-Moshi

Pentru tampoane de protocol, Retrofit suporta:

  • Protobuf: com.squareup.retrofit2: convertor-Protobuf
  • Sârmă: com.squareup.retrofit2: convertor fire

Și pentru XML Retrofit, suportă:

  • Cadru simplu: com.squareup.retrofit2: convertor-simpleframework

Deci, de ce folosiți Retrofit?

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. 

1. Creați un proiect Android Studio

Activați Android Studio și creați un nou proiect cu o activitate goală numită Activitate principala.

2. Declararea dependențelor

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. 

3. Adăugarea permisului Internet

Pentru a efectua operațiuni de rețea, trebuie să includeți INTERNET permisiune în manifestarea cererii: AndroidManifest.xml.

           

4. Modelele de generare automată

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. 

Modificați modelele de date pentru Android Studio

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 Call savePost (@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.

Utilizarea @Corp Adnotare

Putem 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 apelului savePost (@ Postare Post Post);

7. Crearea utilitarelor API

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 /

8. Crearea layout-ului

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. 

     

9. Executarea solicitării POST

Î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 suna inapoi).

Înţelegere 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.

Cereri sincrone

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.

Utilizând RxJava 

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:

Pasul 1

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'

Pasul 2

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; 

Pasul 3

Actualizați APIService savePost (Titlu șir, Corp String, String userId) metodă de a deveni un observator. 

@POST ("/ posts") @FormUrlEncoded Observable savePost (@Field ("title") Titlu șir, @Field ("body") Corp String, @Field ("userId") long userId);

Pasul 4

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. 

10. Testarea aplicației

Î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. 

11. Executarea unei cereri PUT

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 Call updatePost (@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)

12. Executarea unei cereri DELETE

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ți deletePost (@ id de lungă durată ("id"));

13. Anularea unei solicitări

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 privat mCall; ... 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 (); 

Concluzie

Î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 POSTA 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+!

  • Animați aplicația Android

    Animațiile au devenit o parte importantă a experienței utilizatorilor Android. Subtilă, animație artizanală este folosită în întregul sistem Android și poate face ...
    Ashraff Hathibelagal
    Dezvoltarea mobilă
  • Concurs practic pe Android cu HaMeR

    În acest tutorial vom explora cadrul HaMeR (Handler, Message and Runnable), unul dintre cele mai puternice modele de concurență disponibile pe Android. Cu…
    Tin Megali
    Android SDK
  • Coding Funcțional Apps Android în Kotlin: Noțiuni de bază

    Ați auzit lucruri pozitive despre limba Kotlin pentru aplicațiile Android și doriți să o încercați singur? Aflați cum să configurați și să începeți codarea în acest nou ...
    Jessica Thornsby
    Android Studio
  • Migrați un App Android la Designul Materialului

    Cu ani în urmă, când Android era încă un sistem de operare mobil, a fost destul de notoriu pentru interfața sa de utilizator urâtă. Deoarece nu exista nici un design ...
    Ashraff Hathibelagal
    Android
Cod