OkHttp è una libreria di terze parti introdotta da Square nel 2013 per inviare e ricevere richieste di rete basate su HTTP.
OkHttp Android
Inizialmente Android aveva solo due client HTTP: HttpURLConnection e Apache HTTP Client; per inviare e ricevere dati dal web. Ciascuno di questi client richiedeva molto codice boilerplate da scrivere all’interno dei metodi AsyncTask o del thread di background. Inoltre, questi client hanno i propri limiti quando si trattava di annullare una richiesta HTTP o di pooling delle connessioni. OkHttp android fornisce un’implementazione delle interfacce HttpURLConnection e Apache Client lavorando direttamente su un socket Java senza utilizzare alcuna dipendenza extra.
Vantaggi di OkHttp Android
Alcuni vantaggi che OkHttp ci offre sono:
- Pooling delle connessioni
- Compressione Gzip
- Cache
- Ripristino da problemi di rete
- Reindirizzamenti
- Ritentativi
- Supporto per chiamate sincrone e asincrone
Chiamate sincrone vs asincrone
- Le chiamate sincrone richiedono un wrapper AsyncTask attorno ad esse. Ciò significa che non supportano l’annullamento di una richiesta. Inoltre, gli AsyncTask generalmente perdono il contesto dell’Activity, il che non è preferibile.
- La chiamata asincrona è il modo consigliato poiché supporta l’annullamento nativo, l’etichettatura di più richieste e l’annullamento di tutte con una singola chiamata di metodo (invocando il cancello sull’istanza dell’Activity all’interno del metodo onPause o onDestroy).
Prima di esaminare l’implementazione di OkHttp android, aggiungi la seguente dipendenza
compile 'com.squareup.okhttp3:okhttps:3.4.1'
Aggiungi il permesso per internet all’interno del file AndroidManifest.xml
.
<uses-permission android:name="android.permission.INTERNET"/>
Esempio di codice OkHttp Android
Il MainActivity.java per le chiamate sincrone è riportato di seguito.
package com.journaldev.okhttp;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
OkHttpClient client = new OkHttpClient();
TextView txtString;
public String url= "https://reqres.in/api/users/2";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtString= (TextView)findViewById(R.id.txtString);
OkHttpHandler okHttpHandler= new OkHttpHandler();
okHttpHandler.execute(url);
}
public class OkHttpHandler extends AsyncTask {
OkHttpClient client = new OkHttpClient();
@Override
protected String doInBackground(String...params) {
Request.Builder builder = new Request.Builder();
builder.url(params[0]);
Request request = builder.build();
try {
Response response = client.newCall(request).execute();
return response.body().string();
}catch (Exception e){
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
txtString.setText(s);
}
}
}
Per le chiamate asincrone, il MainActivity.java dovrebbe essere definito come:
package com.journaldev.okhttp;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
TextView txtString;
public String url= "https://reqres.in/api/users/2";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtString= (TextView)findViewById(R.id.txtString);
try {
run();
} catch (IOException e) {
e.printStackTrace();
}
}
void run() throws IOException {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
call.cancel();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String myResponse = response.body().string();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
txtString.setText(myResponse);
}
});
}
});
}
}
Abbiamo utilizzato un API di prova da qui. La stringa di risposta restituita è nel formato JSON che viene stampato sullo schermo. Puoi provare altre API open source come l’API di Github, Stackoverflow, ecc.
Esempio di Parametri di Query di OkHttp
Se ci sono parametri di query possiamo passarli facilmente utilizzando una classe HttpUrl.Builder
.
HttpUrl.Builder urlBuilder = HttpUrl.parse("https://httpbin.org/get).newBuilder();
urlBuilder.addQueryParameter("website", "www.journaldev.com");
urlBuilder.addQueryParameter("tutorials", "android");
String url = urlBuilder.build().toString();
Request request = new Request.Builder()
.url(url)
.build();
L’URL sopra è stato ottenuto da https://resttesttest.com/.
Esempio di Intestazioni di Android di OkHttp
Se ci sono parametri di query autenticati, possono essere aggiunti sotto forma di intestazioni come mostrato di seguito:
Request request = new Request.Builder()
.header("Authorization", "replace this text with your token")
.url("your api url")
.build();
Elaborazione della Risposta JSON
Possiamo analizzare i dati JSON per ottenere i parametri rilevanti e visualizzarli in un TextView come nel codice seguente.
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
call.cancel();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
final String myResponse = response.body().string();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
JSONObject json = new JSONObject(myResponse);
txtString.setText(json.getJSONObject("data").getString("first_name")+ " "+json.getJSONObject("data").getString("last_name"));
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
});
Esempio di POST di OkHttp Android
Fino ad ora, abbiamo guardato come ottenere una risposta chiamando alcune API. Per inviare dei dati al server, dobbiamo costruire la nostra richiesta nel seguente modo.
public class MainActivity extends AppCompatActivity {
public String postUrl= "https://reqres.in/api/users/";
public String postBody="{\n" +
" \"name\": \"morpheus\",\n" +
" \"job\": \"leader\"\n" +
"}";
public static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
postRequest(postUrl,postBody);
} catch (IOException e) {
e.printStackTrace();
}
}
void postRequest(String postUrl,String postBody) throws IOException {
OkHttpClient client = new OkHttpClient();
RequestBody body = RequestBody.create(JSON, postBody);
Request request = new Request.Builder()
.url(postUrl)
.post(body)
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
call.cancel();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
Log.d("TAG",response.body().string());
}
});
}
}
Nel codice sopra, abbiamo utilizzato la classe MediaType che fa parte di OkHttp per definire il tipo di dati in transito. Abbiamo utilizzato l’URL dell’API di test da https://reqres.in/. Il metodo post(RequestBody body)
viene chiamato su RequestBuilder con il valore rilevante. Il Log mostra la seguente risposta. {"name":"morpheus","job":"leader","id":"731","createdAt":"2017-01-03T17:26:05.158Z"}
. OkHttp è il HttpClient consigliato utilizzato all’interno della libreria di networking Retrofit. Esamineremo questo nel prossimo tutorial. Abbiamo aggiunto tre pulsanti nel layout per invocare ciascuno dei metodi, postRequest(), run() e la classe wrapper AsyncTask. Puoi scaricare il progetto finale di OkHttp Android dal link qui sotto.
Source:
https://www.digitalocean.com/community/tutorials/okhttp-android-example-tutorial