OkHttp é uma biblioteca de terceiros que foi 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 considerável de código de inicialização para ser escrito dentro dos métodos AsyncTask ou da thread de fundo. 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 traz são:
- Pooling de conexão
- Compactação com gzip
- Armazenamento em cache
- Recuperação de problemas de rede
- Redirecionamentos
- Tentativas
- Suporte para chamadas síncronas e assíncronas
Chamadas Síncronas vs Assíncronas
- Chamadas Síncronas exigem um invólucro AsyncTask ao redor delas. Isso significa que não suporta o cancelamento de uma solicitação. Além disso, AsyncTasks geralmente vazam o contexto da Activity, o que não é preferido.
- Chamada Assíncrona é a maneira recomendada, pois suporta cancelamento nativo, etiquetando múltiplas solicitações e cancelando todas com uma única chamada de método (invocando o cancelamento na instância de Activity dentro do método onPause ou onDestroy).
Antes de examinarmos a implementação do OkHttp 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"/>
Código de Exemplo OkHttp Android
O MainActivity.java para Chamadas Síncronas é apresentado 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 é do formato JSON que é impressa na tela. Você pode experimentar outras API’s de código aberto como Github API, Stackoverflow etc.
Exemplo de Parâmetros de Query OkHttp
Se houver quaisquer parâmetros de consulta, podemos facilmente passá-los usando uma 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 Headers Android OkHttp
Se houver quaisquer parâmetros de consulta autenticados, eles podem ser adicionados na forma de headers como 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 no Android
Até agora, nós 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 enviado. Utilizamos 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. Vamos explorar isso no próximo tutorial. Adicionamos três botões no layout para invocar cada um dos métodos, postRequest(), run() e a classe de invólucro AsyncTask. Você pode baixar o projeto final do Android OkHttp no link abaixo.
Source:
https://www.digitalocean.com/community/tutorials/okhttp-android-example-tutorial