diff --git a/libraries/pom.xml b/libraries/pom.xml
index fbab220a30..8a4ccdf5b5 100644
--- a/libraries/pom.xml
+++ b/libraries/pom.xml
@@ -517,6 +517,11 @@
com.squareup.retrofit2
adapter-rxjava
${retrofit.version}
+
+
+ com.squareup.okhttp3
+ logging-interceptor
+ 3.9.0
com.darwinsys
diff --git a/libraries/src/main/java/com/baeldung/retrofitguide/GitHubServiceGenerator.java b/libraries/src/main/java/com/baeldung/retrofitguide/GitHubServiceGenerator.java
new file mode 100644
index 0000000000..d32891be9e
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/retrofitguide/GitHubServiceGenerator.java
@@ -0,0 +1,58 @@
+package com.baeldung.retrofitguide;
+
+import java.io.IOException;
+import okhttp3.Interceptor;
+import okhttp3.OkHttpClient;
+import okhttp3.Request;
+import okhttp3.Response;
+import okhttp3.logging.HttpLoggingInterceptor;
+import retrofit2.Retrofit;
+import retrofit2.converter.gson.GsonConverterFactory;
+
+public class GitHubServiceGenerator {
+
+ private static final String BASE_URL = "https://api.github.com/";
+
+ private static Retrofit.Builder builder
+ = new Retrofit.Builder()
+ .baseUrl(BASE_URL)
+ .addConverterFactory(GsonConverterFactory.create());
+
+ private static Retrofit retrofit = builder.build();
+
+ private static OkHttpClient.Builder httpClient
+ = new OkHttpClient.Builder();
+
+ private static HttpLoggingInterceptor logging
+ = new HttpLoggingInterceptor()
+ .setLevel(HttpLoggingInterceptor.Level.BASIC);
+
+ public static S createService(Class serviceClass) {
+ if (!httpClient.interceptors().contains(logging)) {
+ httpClient.addInterceptor(logging);
+ builder.client(httpClient.build());
+ retrofit = builder.build();
+ }
+ return retrofit.create(serviceClass);
+ }
+
+ public static S createService(Class serviceClass, final String token) {
+ if (token != null) {
+ httpClient.interceptors().clear();
+ httpClient.addInterceptor(new Interceptor() {
+ @Override
+ public Response intercept(Interceptor.Chain chain) throws IOException {
+ Request original = chain.request();
+ Request.Builder builder = original.newBuilder()
+ .header("Authorization", token);
+ Request request = builder.build();
+ return chain.proceed(request);
+ }
+ });
+ builder.client(httpClient.build());
+ retrofit = builder.build();
+ }
+ return retrofit.create(serviceClass);
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/retrofitguide/Main.java b/libraries/src/main/java/com/baeldung/retrofitguide/Main.java
new file mode 100644
index 0000000000..8a674f634b
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/retrofitguide/Main.java
@@ -0,0 +1,49 @@
+package com.baeldung.retrofitguide;
+
+import java.io.IOException;
+import okhttp3.OkHttpClient;
+import retrofit2.Call;
+import retrofit2.Callback;
+import retrofit2.Response;
+import retrofit2.Retrofit;
+import retrofit2.converter.gson.GsonConverterFactory;
+
+public class Main {
+
+ public static void main(String[] args) {
+ //Manual creation
+ OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
+ Retrofit retrofit = new Retrofit.Builder()
+ .baseUrl("https://api.github.com/")
+ .addConverterFactory(GsonConverterFactory.create())
+ .client(httpClient.build())
+ .build();
+ UserService service = retrofit.create(UserService.class);
+ //Using GitHubServiceGenerator
+ service = GitHubServiceGenerator.createService(UserService.class);
+ Call callSync = service.getUser("eugenp");
+ Call callAsync = service.getUser("eugenp");
+
+ try {
+ Response response = callSync.execute();
+ User user = response.body();
+ System.out.println(user);
+ } catch (IOException ex) {
+ }
+
+ // Execute the call asynchronously. Get a positive or negative callback.
+ callAsync.enqueue(new Callback() {
+ @Override
+ public void onResponse(Call call, Response response) {
+ User user = response.body();
+ System.out.println(user);
+ }
+
+ @Override
+ public void onFailure(Call call, Throwable throwable) {
+ System.out.println(throwable);
+ }
+ });
+
+ }
+}
diff --git a/libraries/src/main/java/com/baeldung/retrofitguide/User.java b/libraries/src/main/java/com/baeldung/retrofitguide/User.java
new file mode 100644
index 0000000000..1b097aa4f1
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/retrofitguide/User.java
@@ -0,0 +1,65 @@
+package com.baeldung.retrofitguide;
+
+public class User {
+
+ private String login;
+ private long id;
+ private String url;
+ private String company;
+ private String blog;
+ private String email;
+
+ public String getLogin() {
+ return login;
+ }
+
+ public void setLogin(String login) {
+ this.login = login;
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+ public String getCompany() {
+ return company;
+ }
+
+ public void setCompany(String company) {
+ this.company = company;
+ }
+
+ public String getBlog() {
+ return blog;
+ }
+
+ public void setBlog(String blog) {
+ this.blog = blog;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ @Override
+ public String toString() {
+ return "User{" + "login=" + login + ", id=" + id + ", url=" + url + ", company=" + company + ", blog=" + blog + ", email=" + email + '}';
+ }
+
+}
diff --git a/libraries/src/main/java/com/baeldung/retrofitguide/UserService.java b/libraries/src/main/java/com/baeldung/retrofitguide/UserService.java
new file mode 100644
index 0000000000..6e18e685ca
--- /dev/null
+++ b/libraries/src/main/java/com/baeldung/retrofitguide/UserService.java
@@ -0,0 +1,17 @@
+package com.baeldung.retrofitguide;
+
+import java.util.List;
+import retrofit2.Call;
+import retrofit2.http.GET;
+import retrofit2.http.Path;
+import retrofit2.http.Query;
+
+public interface UserService {
+
+ @GET("/users")
+ public Call> getUsers(@Query("per_page") int per_page, @Query("page") int page);
+
+ @GET("/users/{username}")
+ public Call getUser(@Path("username") String username);
+
+}