This tutorial explains the usage and purpose of the HTTP and HTTPS library OkHttp.
1. Before you start
I recommend to use the Java 11 HTTPClient for new applications. This tutorial is still here, so provide information about the Apache HttpClient for existing users.
2. Using OkHttp for efficient network access
2.1. What is OkHTTP?
OkHTTP is an open source project designed to be an efficient HTTP client. It supports the SPDY protocol. SPDY is the basis for HTTP 2.0 and allows multiple HTTP requests to be multiplexed over one socket connection.
If you are using Maven or Gradle as build system you can simply add a
dependency to group ID com.squareup.okhttp
, artifactId, okhttp
and the version 2.5.0 (current as of this writing).
compile 'com.squareup.okhttp:okhttp:2.5.0'
As of Android 5.0, OkHttp is part of the Android platform and is used for all HTTP calls. |
2.2. Creating request objects for make network calls
To use OkHttp you need to create a Request
object.
// avoid creating several instances, should be singleon
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://www.vogella.com/index.html")
.build();
You can also add parameters
HttpUrl.Builder urlBuilder = HttpUrl.parse("https://api.github.help").newBuilder();
urlBuilder.addQueryParameter("v", "1.0");
urlBuilder.addQueryParameter("user", "vogella");
String url = urlBuilder.build().toString();
Request request = new Request.Builder()
.url(url)
.build();
You can also add authentication headers
Request request = new Request.Builder()
.header("Authorization", "your token")
.url("https://api.github.com/users/vogella")
.build();
2.3. Sending and receiving network calls
To make a synchronous network call, use the Client
to create a Call
object and use the execute
method.
Response response = client.newCall(request).execute();
To make asynchronous calls, also create a Call
object but use the enqueue
method.
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
} else {
// do something wih the result
}
}
Note: If you are using Android and want to update the UI, you need to use Content.runOnUiThread(new Runnable)
to sync with the UI thread.
3. Exercise: Using OkHttp
This is an example for the usage of OkHttp in a standard Java
program,
but this library can also be used in Android applications.
This example demonstrates the usage of the API.
Create a new Java project called com.vogella.java.library.okhttp
.
Add OkHttp them to the build path of your project via your Maven or Gradle build. Afterwards create the following test class which is more or less taken for the http://square.github.io/okhttp/ website.
package com.vogella.java.library.okhttp;
import java.io.IOException;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.Response;
public class TestMain {
OkHttpClient client = new OkHttpClient();
// code request code here
String doGetRequest(String url) throws IOException {
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
// post request code here
public static final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");
// test data
String bowlingJson(String player1, String player2) {
return "{'winCondition':'HIGH_SCORE',"
+ "'name':'Bowling',"
+ "'round':4,"
+ "'lastSaved':1367702411696,"
+ "'dateStarted':1367702378785,"
+ "'players':["
+ "{'name':'" + player1 + "','history':[10,8,6,7,8],'color':-13388315,'total':39},"
+ "{'name':'" + player2 + "','history':[6,10,5,10,10],'color':-48060,'total':41}"
+ "]}";
}
String doPostRequest(String url, String json) throws IOException {
RequestBody body = RequestBody.create(JSON, json);
Request request = new Request.Builder()
.url(url)
.post(body)
.build();
Response response = client.newCall(request).execute();
return response.body().string();
}
public static void main(String[] args) throws IOException {
// issue the Get request
TestMain example = new TestMain();
String getResponse = example.doGetRequest("https://www.vogella.com/");
System.out.println(getResponse);
// issue the post request
String json = example.bowlingJson("Jesse", "Jake");
String postResponse = example.doPostRequest("http://www.roundsapp.com/post", json);
System.out.println(postResponse);
}
}
3.1. OkHttp resources
http://square.github.io/okhttp - OkHTTP Homepage
3.2. vogella Java example code
If you need more assistance we offer Online Training and Onsite training as well as consulting