OkHttp is een externe bibliotheek die in 2013 is geïntroduceerd door Square voor het verzenden en ontvangen van HTTP-gebaseerde netwerkverzoeken.
OkHttp Android
In eerste instantie had Android slechts twee HTTP-clients: HttpURLConnection en Apache HTTP Client; voor het verzenden en ontvangen van gegevens van het web. Elk van deze clients vereiste veel standaardcode die moest worden geschreven binnen de AsyncTask of de achtergrondthread-methoden. Bovendien hebben deze clients hun eigen reeks beperkingen als het ging om het annuleren van een HTTP-verzoek of het beheren van connectiepools. OkHttp android biedt een implementatie van HttpURLConnection en Apache Client interfaces door rechtstreeks te werken op een java Socket zonder extra afhankelijkheden te gebruiken.
Voordelen van OkHttp Android
Enkele voordelen die OkHttp ons biedt zijn:
- Connectiebeheer
- Gziping
- Caching
- Herstel van netwerkproblemen
- Redirects
- Herpogingen
- Ondersteuning voor synchrone en asynchrone oproepen
Synchrone vs Asynchrone oproepen
- Synchrone oproepen vereisen een AsyncTask-wrapper eromheen. Dat betekent dat het annuleren van een verzoek niet wordt ondersteund. Bovendien lekken AsyncTasks over het algemeen de context van de activiteit, wat niet de voorkeur heeft.
- Asynchrone aanroep is de aanbevolen manier, omdat het native annuleren ondersteunt, meerdere verzoeken kan taggen en ze allemaal kan annuleren met één methodeoproep (door de annulering op de activiteitsinstantie binnen de onPause of onDestroy methode te activeren).
Voordat we naar de implementatie van OkHttp voor Android kijken, voeg de volgende afhankelijkheid toe
compile 'com.squareup.okhttp3:okhttps:3.4.1'
Voeg de toestemming voor internet toe in het AndroidManifest.xml
-bestand.
<uses-permission android:name="android.permission.INTERNET"/>
OkHttp Android Voorbeeldcode
De MainActivity.java voor synchrone oproepen wordt hieronder gegeven.
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);
}
}
}
Voor asynchrone oproepen moet de MainActivity.java als volgt worden gedefinieerd:
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);
}
});
}
});
}
}
We hebben een test-API gebruikt van hier. De response string die wordt geretourneerd is in JSON-formaat en wordt op het scherm afgedrukt. Je kunt andere open source API’s uitproberen zoals de Github API, Stackoverflow, enz.
Voorbeeld van OkHttp Query Parameters
Als er query parameters zijn, kunnen we deze gemakkelijk doorgeven met behulp van een HttpUrl.Builder
-klasse.
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();
De bovenstaande URL werd verkregen van https://resttesttest.com/.
Voorbeeld van OkHttp Android Headers
Als er geauthenticeerde query parameters zijn, kunnen ze worden toegevoegd in de vorm van headers zoals hieronder wordt getoond:
Request request = new Request.Builder()
.header("Authorization", "replace this text with your token")
.url("your api url")
.build();
Verwerking van de JSON-response
We kunnen de JSON-gegevens parsen om de relevante parameters te krijgen en deze in een TextView weer te geven zoals in de onderstaande code.
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();
}
}
});
}
});
Voorbeeld van OkHttp Android POST
Tot nu toe hebben we gekeken naar het verkrijgen van een respons door een paar API’s aan te roepen. Om gegevens naar de server te posten, moeten we ons verzoek op de volgende manier opbouwen.
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());
}
});
}
}
In de bovenstaande code hebben we de MediaType-klasse gebruikt die deel uitmaakt van OkHttp om het type gegevens dat wordt doorgegeven te definiëren. We hebben de test API-URL gebruikt van https://reqres.in/. De post(RequestBody body)
-methode wordt aangeroepen op de RequestBuilder met de relevante waarde. Het Log toont de volgende respons. {"name":"morpheus","job":"leader","id":"731","createdAt":"2017-01-03T17:26:05.158Z"}
. OkHttp is de aanbevolen HttpClient die wordt gebruikt in de Retrofit Networking Library. We zullen hier later op ingaan in de volgende tutorial. We hebben drie knoppen toegevoegd aan de layout om elk van de methoden postRequest(), run() en de AsyncTask-wrapperklasse aan te roepen. U kunt het uiteindelijke Android OkHttp-project downloaden via de onderstaande link.
Source:
https://www.digitalocean.com/community/tutorials/okhttp-android-example-tutorial