OkHttp é uma biblioteca de terceiros introduzida pela Square em 2013 para enviar e receber solicitações de rede baseadas em HTTP.
OkHttp Android
Inicialmente, o Android tinha apenas dois clientes HTTP: HttpURLConnection e Apache HTTP Client; para enviar e receber dados da web. Cada um desses clientes exigia uma quantidade significativa de código de inicialização a ser escrito dentro do AsyncTask ou dos métodos de thread em segundo plano. Além disso, esses clientes têm seus próprios conjuntos de limitações quando se trata de cancelar uma solicitação HTTP ou pooling de conexão. O OkHttp android fornece uma implementação das interfaces HttpURLConnection e Apache Client trabalhando diretamente em cima de um Socket Java sem usar dependências extras.
Vantagens do OkHttp Android
Algumas vantagens que o OkHttp nos proporciona são:
- Pooling de conexões
- Compactação Gzip
- Armazenamento em cache
- Recuperação de problemas de rede
- Redirecionamentos
- Retentativas
- Suporte para chamadas síncronas e assíncronas
Chamadas Síncronas vs. Chamadas Assíncronas
- Chamadas síncronas requerem um envoltório AsyncTask ao redor delas. Isso significa que não suporta cancelar uma solicitação. Além disso, AsyncTasks geralmente vazam o contexto da Activity, o que não é preferível.
- Chamadas assíncronas são a maneira recomendada, pois suportam cancelamento nativo, marcação de várias solicitações e cancelamento de todas com uma única chamada de método (invocando o cancelamento na instância da Activity dentro do método onPause ou onDestroy).
Antes de examinarmos a implementação do OkHttp no Android, adicione a seguinte dependência
compile 'com.squareup.okhttp3:okhttps:3.4.1'
Adicione a permissão para internet dentro do arquivo AndroidManifest.xml
.
<uses-permission android:name="android.permission.INTERNET"/>
Exemplo de Código OkHttp Android
O MainActivity.java para Chamadas Síncronas é fornecido abaixo.
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 Chamadas Assíncronas, o MainActivity.java deve ser definido 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);
}
});
}
});
}
}
Nós utilizamos uma API de teste de aqui. A string de resposta retornada está no formato JSON, que é exibida na tela. Você pode experimentar outras APIs de código aberto, como a API do Github, Stackoverflow, etc.
Exemplo de Parâmetros de Consulta do OkHttp
Se houver parâmetros de consulta, podemos facilmente passá-los usando a 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();
A URL acima foi obtida de https://resttesttest.com/.
Exemplo de Cabeçalhos do OkHttp para Android
Se houver parâmetros de consulta autenticados, eles podem ser adicionados na forma de cabeçalhos, conforme mostrado abaixo:
Request request = new Request.Builder()
.header("Authorization", "replace this text with your token")
.url("your api url")
.build();
Processando a Resposta JSON
Podemos analisar os dados JSON para obter os parâmetros relevantes e exibi-los em um TextView, conforme o código abaixo.
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();
}
}
});
}
});
Exemplo de POST do OkHttp Android
Até agora, vimos como obter uma resposta chamando algumas APIs. Para enviar dados para o servidor, precisamos construir nossa solicitação da seguinte maneira.
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());
}
});
}
}
No código acima, usamos a classe MediaType que faz parte do OkHttp para definir o tipo de dados sendo passados. Usamos a URL da API de teste de https://reqres.in/. O método post(RequestBody body)
é chamado no RequestBuilder com o valor relevante. O Log exibe a seguinte resposta. {"name":"morpheus","job":"leader","id":"731","createdAt":"2017-01-03T17:26:05.158Z"}
. OkHttp é o HttpClient recomendado usado dentro da Biblioteca de Rede Retrofit. Veremos isso no próximo tutorial. Adicionamos três botões no layout para invocar cada um dos métodos, postRequest(), run() e a classe wrapper AsyncTask. Você pode baixar o Projeto de Exemplo do Android OkHttp final no link abaixo.
Source:
https://www.digitalocean.com/community/tutorials/okhttp-android-example-tutorial