Gorivo HTTP knjižnica s Kotlinom
1. Pregled
U ovom ćemo uputstvu pogledati HTTP knjižnicu goriva, što je, prema autorovim riječima, najlakša HTTP mrežna knjižnica za Kotlin / Android. Nadalje, knjižnica se može koristiti i na Javi.
Glavne značajke knjižnice uključuju:
- Podrška za osnovne HTTP glagole (GET, POST, DELETE, itd.) I asinkrone i zahtjeve za blokiranje
- Mogućnost preuzimanja i prijenosa datoteke (višedijelni / obrasci-podaci)
- Mogućnost upravljanja globalnom konfiguracijom
- Ugrađeni moduli za serializaciju objekata (Jackson, Gson, Mhosi, Forge)
- Podrška za Kotlinov modul suprograma i RxJava 2.x
- Jednostavno postavljanje uzorka dizajna usmjerivača
2. Ovisnosti
Knjižnica se sastoji od različitih modula, tako da lako možemo uključiti značajke koje su nam potrebne. Neki od njih uključuju:
- Modul za podršku RxJava i Kotlin's Coroutines
- Podrška modula za Android i Android LiveData Architecture Components
- Četiri modula od kojih možemo odabrati modul za serializaciju objekata koji ćemo koristiti - Gson, Jackson, Moshi ili Forge.
U ovom uputstvu usredotočit ćemo se na osnovni modul, module za Coroutines, RxJava i Gson modul za serializaciju:
com.github.kittinunf.fuel gorivo $ {gorivo.verzija} com.github.kittinunf.fuel gorivo-gson $ {gorivo.verzija} com.github.kittinunf.fuel gorivo-rxjava $ {gorivo.verzija} com.github. kittinunf.fuel gorivo-korotaine $ {fuel.version}
Najnovije verzije možete pronaći na JFrog Bintray.
3. Podnošenje zahtjeva
Da bi podnio zahtjev, gorivo nudi a Niz produženje. Uz to, kao alternativu, možemo koristiti i Gorivo klasa koja ima metodu za svaki HTTP glagol.
Gorivo podržava sve HTTP glagole, osim PATCH-a. Razlog je taj Goriva HttpClient je omot gotov java.net.HttpUrlConnection koji ne podržava PATCH.
Da bi uskočio problem, HttpClient pretvara PATCH zahtjeve u POST zahtjev i dodaje X-HTTP-Overdoid metode: PATCH zaglavlja, pa ćemo morati biti sigurni da su naši API-ji konfigurirani tako da prihvaćaju ovo zaglavlje prema zadanim postavkama.
Kako bismo objasnili značajke goriva, koristit ćemo httpbin.org, jednostavni HTTP zahtjev i uslugu odgovora, i JsonPlaceholder - lažni internetski API za testiranje i izradu prototipova.
3.1. GET Zahtjev
Počnimo stvarati jednostavan HTTP DOBITI zahtjev u async načinu:
"//httpbin.org/get".httpGet().response {zahtjev, odgovor, rezultat -> // rukovanje odgovorom}
Koristeći httpGet () preko Niz daje nam a Utrostručiti.
The Proizlaziti je struktura podataka funkcionalnog stila koja sadrži rezultat operacije (uspjeh ili neuspjeh). Ponovno ćemo posjetiti Proizlaziti struktura podataka u kasnijoj fazi.
Zahtjev možemo poslati i u načinu blokiranja:
val (zahtjev, odgovor, rezultat) = "//httpbin.org/get" .httpGet (). response ()
Imajte na umu da su vraćeni parametri isti kao i async verzija, ali u ovom je slučaju nit koja je poslala zahtjev blokirana.
Također, postoji mogućnost korištenja kodiranih parametara URL-a:
val (zahtjev, odgovor, rezultat) = "//jsonplaceholder.typicode.com/posts" .httpGet (listOf ("userId" do "1")). response () // riješiti //jsonplaceholder.typicode.com/ postova? userId = 1
The httpGet () metoda (i ostale slične) mogu dobiti a Popis za kodiranje parametara URL-a.
3.2. POST zahtjev
POST zahtjeve možemo poslati na isti način kao i za GET, koristeći httpPost () ili pomoću objaviti () metoda Gorivo razred:
"//httpbin.org/post".httpPost (). response {zahtjev, odgovor, rezultat -> // rukovanje odgovorom}
val (zahtjev, odgovor, rezultat) = Fuel.post ("// httpbin.org/post") .response ()
Ako imamo tijelo, možemo ga provući tijelo() metoda u JSON formatu niza:
val bodyJson = "" "{" title ":" foo "," body ":" bar "," id ":" 1 "}" "" val (zahtjev, odgovor, rezultat) = Fuel.post ("// jsonplaceholder.typicode.com/posts ") .body (bodyJson) .response ()
3.3. Ostali glagoli
Kao i za GET i POST, postoji metoda za svaki od preostalih glagola:
Fuel.put ("// httpbin.org/put") Fuel.delete ("// httpbin.org/delete") Fuel.head ("// httpbin.org/get") Fuel.patch ("// httpbin .org / zakrpa ")
Zapamti to Fuel.patch () će izvršiti POST zahtjev saX-HTTP-Nadjačavanje metode: PATCH Zaglavlje.
4. Konfiguracija
Knjižnica isporučuje jednokračni objekt - FuelManager.instance - za upravljanje globalnom konfiguracijom.
Konfigurirajmo osnovni put, neka zaglavlja i uobičajene parametre. Također, konfigurirajmo neke presretače.
4.1. BasePath
Koristeći basePath varijablu možemo postaviti zajednički put za sve zahtjeve.
FuelManager.instance.basePath = "//httpbin.org" val (zahtjev, odgovor, rezultat) = "/get".httpGet (). Response () // izvršit će GET //httpbin.org/get
4.2. Zaglavlja
Nadalje, možemo upravljati uobičajenim HTTP zaglavljima pomoću baseHeaders karta:
FuelManager.instance.baseHeaders = mapOf ("OS" u "Debian")
Na drugi način, ako želimo postaviti lokalno zaglavlje, možemo koristiti Zaglavlje() metoda na zahtjev:
val (zahtjev, odgovor, rezultat) = "/ get" .httpGet () .header (mapOf ("OS" to "Debian")) .response ()
4.3. Parame
Napokon, zajedničke parametre možemo postaviti i pomoću baseParams popis:
FuelManager.instance.baseParams = listOf ("foo" do "bar")
4.4. Druge opcije
Postoji mnogo više opcija kojima možemo upravljati Upravitelj gorivom:
- pohrana ključeva koji je null prema zadanim postavkama
- socketFactory koje će osigurati korisnik ili će biti izvedene iz pohrana ključeva ako nije null
- hostnameVerifier koja je prema zadanim postavkama postavljena na upotrebu one koju pruža HttpsURLConnection razred
- requestInterceptors i responseInterceptori
- pauza i timeoutRead za zahtjev
4.5. Presretači zahtjeva / odgovora
Što se tiče presretača, možemo dodati isporučene presretače zahtjeva / odgovora poput cUrlLoggingRequestInterceptors (), ili možemo definirati svoje:
FuelManager.instance.addRequestInterceptor (cUrlLoggingRequestInterceptor ())
FuelManager.instance.addRequestInterceptor (tokenInterceptor ()) fun tokenInterceptor () = {next: (Zahtjev) -> Zahtjev -> {req: Zahtjev -> req.header (mapOf ("Autorizacija" na "Donositelj AbCdEf123456")) sljedeći ( zahtjev)}}
5. Rukovanje odgovorima
Prethodno smo uveli funkcionalnu strukturu podataka - Proizlaziti - koji predstavlja rezultat operacije (uspjeh ili neuspjeh).
Raditi sa Proizlaziti je lako, to je klasa podataka koja može sadržavati odgovor u ByteArray, String, JSON, ili generički T objekt:
zabavan odgovor (rukovatelj: (Zahtjev, odgovor, rezultat) -> Jedinica) fun responseString (rukovatelj: (Zahtjev, odgovor, rezultat) -> Jedinica) zabavan odgovorJson (voditelj: (Zahtjev, odgovor, rezultat) -> Jedinica) fun responseObject (deserializator: ResponseDeserializable, rukovatelj: (Zahtjev, odgovor, rezultat) -> Jedinica)
Dobijmo odgovor kao a Niz da to ilustriram:
val (zahtjev, odgovor, rezultat) = Fuel.post ("// httpbin.org/post") .responseString () val (korisni teret, pogreška) = rezultat // korisni teret je niz
Imajte na umu da odgovor u JSON formatu zahtijeva Android ovisnosti.
com.github.kittinunf.fuel gorivo-android $ {gorivo.verzija}
6. JSON serializacija / deserijalizacija
Fuel pruža ugrađenu podršku za deserializaciju odgovora pomoću četiri metode koje, ovisno o našim potrebama i odabranoj JSON biblioteci za raščlanjivanje, moramo implementirati:
javna zabava deserializirati (bajtovi: ByteArray): T? javna zabava deserializirati (inputStream: InputStream): T? javna zabava deserializirati (čitatelj: Čitatelj): T? javna zabava deserializirati (sadržaj: String): T?
Uključivanjem Gson modula možemo deserializirati i serializirati objekte:
klasa podataka Post (var userId: Int, var id: Int, var title: String, var body: String) {class Deserializer: ResponseDeserializable {nadjačati zabavu deserializirati (sadržaj: String): Array = Gson (). fromJson (content, Array :: class.java)}}
Objekte možemo deserializirati pomoću prilagođenog deserijalizatora:
"//jsonplaceholder.typicode.com/posts" .httpGet (). responseObject (Post.Deserializer ()) {_, _, result -> val postsArray = result.component1 ()}
Ili putem responseObject koji koristi interni Gson deserijalizator:
"//jsonplaceholder.typicode.com/posts/1" .httpGet (). responseObject {_, _, result -> val post = result.component1 ()}
S druge strane, možemo serializirati pomoću Gson (). ToJson ():
val post = Post (1, 1, "Lorem", "Lorem Ipse dolor sit amet") val (zahtjev, odgovor, rezultat) = Fuel.post ("// jsonplaceholder.typicode.com/posts") .header (" Content-Type "to" application / json ") .body (Gson (). ToJson (post) .toString ())
Važno je postaviti Vrsta sadržaja, u suprotnom, poslužitelj može primiti objekt unutar drugog JSON objekta.
Na kraju, na sličan način, to možemo učiniti pomoću ovisnosti Jackson, Moshi ili Forge.
7. Preuzmite i prenesite datoteku
Biblioteka goriva uključuje sve potrebne značajke za preuzimanje i prijenos datoteka.
7.1. preuzimanje datoteka
Uz preuzimanje datoteka() metodom možemo jednostavno preuzeti datoteku i spremiti je u datoteku koju je vratio odredište() lambda:
Fuel.download ("// httpbin.org/bytes/32768") .destination {response, url -> File.createTempFile ("temp", ".tmp")}
Također možemo preuzeti datoteku s voditeljem napretka:
Fuel.download ("// httpbin.org/bytes/327680") .progress {readBytes, totalBytes -> val progress = readBytes.toFloat () / totalBytes.toFloat () // ...}
7.2. Učitaj
Na isti način, možemo poslati datoteku pomoću Učitaj() metoda, označavajući datoteku za prijenos s izvor() metoda:
Fuel.upload ("/ upload"). Source {zahtjev, url -> File.createTempFile ("temp", ".tmp")}
Imajte na umu da Učitaj() prema zadanim postavkama koristi glagol POST. Ako želimo koristiti drugi HTTP glagol, možemo ga odrediti:
Fuel.upload ("/ upload", Method.PUT) .source {zahtjev, url -> File.createTempFile ("temp", ".tmp")}
Štoviše, možemo prenijeti više datoteka pomoću izvori () metoda koja prihvaća popis datoteka:
Fuel.upload ("/ post"). Sources {request, url -> listOf (File.createTempFile ("temp1", ".tmp"), File.createTempFile ("temp2", ".tmp"))}}
I na kraju, možemo prenijeti blob podataka s Ulazni tok:
Fuel.upload ("/ post"). Blob {zahtjev, url -> Blob ("filename.png", someObject.length, {someObject.getInputStream ()})}
8. Podrška za RxJava i Coroutines
Gorivo pruža podršku za RxJavu i Coroutines, dva načina pisanja asyncrhonusa, neblokirajućeg koda.
RxJava je Java VM implementacija Reactive Extensions, knjižnica za sastavljanje asinkronih programa i programa temeljenih na događajima.
Proširuje obrazac Observer kako bi podržao sekvence podataka / događaja i dodaje operatore koji omogućuju deklarativno sastavljanje sekvenci bez brige o sinkronizaciji, sigurnosti niti i istodobnim strukturama podataka.
Kotlinove koroutine su poput laganih niti i kao takve mogu paralelno trčati, čekati jedni druge i komunicirati ... Najveća je razlika u tome što su koroutine vrlo jeftine; možemo ih stvoriti tisuće i platiti vrlo malo u smislu memorije.
8.1. RxJava
Da bi podržao RxJava 2.x, Fuel nudi šest proširenja:
Zabava Zahtjev.rx_response (): Pojedinačno<>> zabavan zahtjev.rx_responseString (charset: Charset): Single<>> Zabava Zahtjev.rx_responseObject (deserializable: Deserializable): Single<>> zahtjev za zabavu.rx_data (): Pojedinačno Zabava Zahtjev.rx_string (charset: Charset): Pojedinačno Zabava Zahtjev.rx_object (deserializable: Deserializable): Single
Imajte na umu da, za podršku svim različitim vrstama odgovora, svaka metoda vraća različitu Singl
Lako možemo koristiti metode "Rx" pozivanjem one relevantnije preko a Zahtjev:
"//jsonplaceholder.typicode.com/posts?id=1" .httpGet (). rx_object (Post.Deserializer ()). pretplatite se {res, bacanje -> val post = res.component1 ()}
8.2. Koroutine
S modulom suprograma, Gorivo pruža funkcije produženja za umotavanje odgovora u koroutinu i rukovanje njegovim rezultatom.
Za upotrebu Coroutines-a dostupni su slični API-ji, npr responseString () postao awaitStringResponse ():
runBlocking {Fuel.get ("// httpbin.org/get"). awaitStringResponse ()}
Također pruža korisne metode za rukovanje objektima koji nisu Niz ili ByteArray (awaitByteArrayResponse ()) koristeći awaitObject (), awaitObjectResult () ili awaitObjectResponse ():
runBlocking {Fuel.get ("// jsonplaceholder.typicode.com/posts?id=1") .awaitObjectResult (Post.Deserializer ())}
Sjetite se da su Kotlinove Coroutines eksperimentalne, što znači da bi se mogle promijeniti u nadolazećim izdanjima.
9. API usmjeravanje
I na kraju, ali ne najmanje važno, za upravljanje mrežnim rutama, Fuel pruža podršku primjenom dizajna dizajna usmjerivača.
Pomoću uzorka usmjerivača možemo centralizirati upravljanje API-jem pomoću Usmjeravanje goriva sučelje, koje pruža kombinaciju metoda za postavljanje odgovarajućeg HTTP glagola, putanje, parametara i zaglavlja prema pozvanoj krajnjoj točki.
Sučelje definira pet svojstava pomoću kojih je moguće konfigurirati naš usmjerivač:
zapečaćena klasa PostRoutingAPI: FuelRouting {postovi klase (val userId: String, nadjačati val body: String?): PostRoutingAPI () komentari klase (val postId: String, override val body: String?): PostRoutingAPI () override val basePath = "/ /jsonplaceholder.typicode.com "override val metoda: Metoda get () {return when (this) {is PostRoutingAPI.posts -> Method.GET is PostRoutingAPI.comments -> Method.GET}} override val path: String get () {return when (this) {is PostRoutingAPI.posts -> "/ posts" is PostRoutingAPI.comments -> "/ comments"}} nadjačati val params: Lista? get () {return when (this) {is PostRoutingAPI.posts -> listOf ("userId" to this.userId) is PostRoutingAPI.comments -> listOf ("postId" to this.postId)}} nadjačati zaglavlja val: Map? get () {return null}}
Da bismo odabrali koji ćemo HTTP glagol koristiti metoda svojstvo, isto tako, možemo poništiti staza svojstvo, tako da odabere odgovarajući put.
Još više s parametarima svojstvo, imamo priliku postaviti parametre zahtjeva, a ako trebamo postaviti HTTP zaglavlja, možemo to učiniti nadjačavanjem odnosnog svojstva.
Stoga ga koristimo na isti način na koji smo ga koristili u svim tutorijalima s zahtjev() metoda:
Zahtjev za gorivom (PostRoutingAPI.posts ("1", null)) .responseObject (Post.Deserializer ()) {zahtjev, odgovor, rezultat -> // rukovanje odgovorom}
Fuel.request (PostRoutingAPI.comments ("1", null)) .responseString {zahtjev, odgovor, rezultat -> // obrada odgovora}
10. Zaključak
U ovom smo članku prikazali HTTP knjižnicu goriva za Kotlin i njegove korisnije značajke za bilo koji slučaj korištenja.
Knjižnica se neprestano razvija, stoga pogledajte njihov GitHub repo - kako biste pratili nove značajke.
Kao i obično, svi isječci koda spomenuti u vodiču mogu se naći u našem GitHub spremištu.