diff --git a/libraries-http-2/pom.xml b/libraries-http-2/pom.xml
index 3c0af51131..96f9e2911d 100644
--- a/libraries-http-2/pom.xml
+++ b/libraries-http-2/pom.xml
@@ -66,6 +66,18 @@
reactive-streams
${reactive.stream.version}
+
+
+
+ com.squareup.retrofit2
+ retrofit
+ ${retrofit.version}
+
+
+ com.squareup.retrofit2
+ converter-gson
+ ${retrofit.version}
+
@@ -76,6 +88,7 @@
1.0.3
9.4.19.v20190610
2.2.11
+ 2.3.0
5.1.9.RELEASE
1.0.3
3.2.12.RELEASE
diff --git a/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApi.java b/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApi.java
new file mode 100644
index 0000000000..5356c12b26
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApi.java
@@ -0,0 +1,19 @@
+package com.baeldung.retrofit.dynamic;
+
+import com.baeldung.retrofit.models.Contributor;
+import com.baeldung.retrofit.models.Repository;
+import retrofit2.Call;
+import retrofit2.http.GET;
+import retrofit2.http.Path;
+import retrofit2.http.Url;
+
+import java.util.List;
+
+public interface GitHubDynamicApi {
+
+ @GET
+ Call> reposList(@Url String url);
+
+ @GET("{fullUrl}")
+ Call> contributorsList(@Path(value = "fullUrl", encoded = true) String fullUrl);
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApiApp.java b/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApiApp.java
new file mode 100644
index 0000000000..06f6b3cef7
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApiApp.java
@@ -0,0 +1,13 @@
+package com.baeldung.retrofit.dynamic;
+
+import java.io.IOException;
+import java.util.List;
+
+public class GitHubDynamicApiApp {
+
+ public static void main(String[] args) throws IOException {
+ String url = "https://api.github.com/users/eugenp/repos";
+ List topContributors = new GitHubDynamicApiService().getTopContributors(url);
+ topContributors.forEach(System.out::println);
+ }
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApiService.java b/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApiService.java
new file mode 100644
index 0000000000..cb8e95f2d5
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/retrofit/dynamic/GitHubDynamicApiService.java
@@ -0,0 +1,44 @@
+package com.baeldung.retrofit.dynamic;
+
+import com.baeldung.retrofit.models.Contributor;
+import com.baeldung.retrofit.models.Repository;
+import retrofit2.Retrofit;
+import retrofit2.converter.gson.GsonConverterFactory;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+class GitHubDynamicApiService {
+
+ private GitHubDynamicApi gitHubDynamicApi;
+
+ GitHubDynamicApiService() {
+ Retrofit retrofit = new Retrofit.Builder().baseUrl("https://api.github.com/").addConverterFactory(GsonConverterFactory.create()).build();
+
+ gitHubDynamicApi = retrofit.create(GitHubDynamicApi.class);
+ }
+
+ List getTopContributors(String url) throws IOException {
+ List repos = gitHubDynamicApi.reposList(url).execute().body();
+
+ repos = repos != null ? repos : Collections.emptyList();
+
+ return repos.stream().flatMap(repo -> getContributors("repos/eugenp/"+repo+"/contributors")).sorted((a, b) -> b.getContributions() - a.getContributions()).map(com.baeldung.retrofit.models.Contributor::getName).distinct().sorted().collect(Collectors.toList());
+ }
+
+ private Stream getContributors(String fullUrl) {
+ List contributors = null;
+ try {
+ contributors = gitHubDynamicApi.contributorsList(fullUrl).execute().body();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ contributors = contributors != null ? contributors : Collections.emptyList();
+
+ return contributors.stream().filter(c -> c.getContributions() > 100);
+ }
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/retrofit/models/Contributor.java b/libraries-http-2/src/main/java/com/baeldung/retrofit/models/Contributor.java
new file mode 100644
index 0000000000..f98b19de96
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/retrofit/models/Contributor.java
@@ -0,0 +1,33 @@
+package com.baeldung.retrofit.models;
+
+import com.google.gson.annotations.SerializedName;
+
+public class Contributor {
+
+ @SerializedName("login")
+ private String name;
+
+ private Integer contributions;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getContributions() {
+ return contributions;
+ }
+
+ public void setContributions(Integer contributions) {
+ this.contributions = contributions;
+ }
+
+ @Override
+ public String toString() {
+ return "Contributer [name=" + name + ", contributions=" + contributions + "]";
+ }
+
+}
diff --git a/libraries-http-2/src/main/java/com/baeldung/retrofit/models/Repository.java b/libraries-http-2/src/main/java/com/baeldung/retrofit/models/Repository.java
new file mode 100644
index 0000000000..6bc91eb772
--- /dev/null
+++ b/libraries-http-2/src/main/java/com/baeldung/retrofit/models/Repository.java
@@ -0,0 +1,30 @@
+package com.baeldung.retrofit.models;
+
+public class Repository {
+
+ private String name;
+
+ private String description;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ @Override
+ public String toString() {
+ return "Repository [name=" + name + ", description=" + description + "]";
+ }
+
+}