OkHttp es una biblioteca de terceros que fue introducida por Square en 2013 para enviar y recibir solicitudes de red basadas en HTTP.
OkHttp Android
Inicialmente, Android solo tenía dos clientes HTTP: HttpURLConnection y Apache HTTP Client; para enviar y recibir datos de la web. Cada uno de estos clientes requería mucho código boilerplate que debía escribirse dentro del AsyncTask o en los métodos de subproceso en segundo plano. Además, estos clientes tienen sus propios conjuntos de limitaciones cuando se trata de cancelar una solicitud HTTP o el pool de conexiones. OkHttp android proporciona una implementación de las interfaces HttpURLConnection y Apache Client trabajando directamente sobre un socket java sin usar dependencias adicionales.
Ventajas de OkHttp Android
Algunas ventajas que nos ofrece OkHttp son:
- Pool de conexiones
- Compresión Gzip
- Caché
- Recuperación de problemas de red
- Redirecciones
- Reintentos
- Soporte para llamadas síncronas y asíncronas
Llamadas síncronas vs. asíncronas
- Las llamadas síncronas requieren un envoltorio AsyncTask alrededor de ellas. Eso significa que no admiten la cancelación de una solicitud. Además, los AsyncTasks generalmente filtran el contexto de la Activity, lo cual no es preferible.
- La llamada asíncrona es el método recomendado ya que admite la cancelación nativa, etiquetar múltiples solicitudes y cancelarlas todas con una sola llamada de método (invocando el cancel en la instancia de Activity dentro del método onPause o onDestroy).
Antes de examinar la implementación de OkHttp en Android, agregue la siguiente dependencia
compile 'com.squareup.okhttp3:okhttps:3.4.1'
Agregue el permiso para internet dentro del archivo AndroidManifest.xml
.
<uses-permission android:name="android.permission.INTERNET"/>
Código de ejemplo de OkHttp en Android
El MainActivity.java para las llamadas síncronas se proporciona a continuación.
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);
}
}
}
Para las llamadas asíncronas, el MainActivity.java debería definirse como:
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);
}
});
}
});
}
}
Hemos utilizado una API de prueba desde aquí. La cadena de respuesta devuelta es del formato JSON que se imprime en la pantalla. Puedes probar otras API de código abierto como la API de Github, Stackoverflow, etc.
Ejemplo de parámetros de consulta OkHttp
Si hay algún parámetro de consulta, podemos pasarlos fácilmente usando una clase 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();
La URL anterior fue obtenida de https://resttesttest.com/.
Ejemplo de encabezados de Android OkHttp
Si hay parámetros de consulta autenticados, se pueden agregar en forma de encabezados como se muestra a continuación:
Request request = new Request.Builder()
.header("Authorization", "replace this text with your token")
.url("your api url")
.build();
Procesamiento de la respuesta JSON
Podemos analizar los datos JSON para obtener los parámetros relevantes y mostrarlos en un TextView como el siguiente código.
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();
}
}
});
}
});
Ejemplo de POST de OkHttp Android
Hasta ahora, hemos visto cómo obtener una respuesta llamando a algunas API. Para enviar datos al servidor, necesitamos construir nuestra solicitud de la siguiente manera.
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());
}
});
}
}
En el código anterior, hemos utilizado la clase MediaType que es parte de OkHttp para definir el tipo de datos que se están pasando. Hemos utilizado la URL de API de prueba de https://reqres.in/. El método post(RequestBody body)
se llama en RequestBuilder con el valor relevante. El Log muestra la siguiente respuesta. {"name":"morpheus","job":"leader","id":"731","createdAt":"2017-01-03T17:26:05.158Z"}
. OkHttp es el HttpClient recomendado que se utiliza dentro de la Biblioteca de Redes Retrofit. Investigaremos esto en el próximo tutorial. Hemos agregado tres botones en el diseño para invocar cada uno de los métodos, postRequest(), run() y la clase envolvente AsyncTask. Puedes descargar el Proyecto final de Android OkHttp desde el siguiente enlace.
Source:
https://www.digitalocean.com/community/tutorials/okhttp-android-example-tutorial