Skip to content

Commit fc8f06d

Browse files
committed
Added OkHttp rest client examples
1 parent 6f916d6 commit fc8f06d

File tree

4 files changed

+224
-0
lines changed

4 files changed

+224
-0
lines changed

stubbornjava-common/src/main/java/com/stubbornjava/common/HttpClient.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.stubbornjava.common;
22

3+
import java.io.IOException;
34
import java.net.CookieManager;
45
import java.net.CookiePolicy;
56
import java.util.concurrent.TimeUnit;
@@ -9,6 +10,7 @@
910

1011
import okhttp3.JavaNetCookieJar;
1112
import okhttp3.OkHttpClient;
13+
import okhttp3.Response;
1214
import okhttp3.logging.HttpLoggingInterceptor;
1315
import okhttp3.logging.HttpLoggingInterceptor.Level;
1416

@@ -62,4 +64,8 @@ public static OkHttpClient newClientWithCookieJar() {
6264
return client.newBuilder().cookieJar(cookieJar).build();
6365
}
6466
// {{end:cookieJar}}
67+
68+
public static RuntimeException unknownException(Response response) throws IOException {
69+
return new RuntimeException(String.format("code: %s, body: %s", response.code(), response.body().string()));
70+
}
6571
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.stubbornjava.common;
2+
3+
import okhttp3.MediaType;
4+
import okhttp3.RequestBody;
5+
6+
// {{start:requestBodies}}
7+
public class RequestBodies {
8+
private RequestBodies() {}
9+
10+
public static RequestBody xml(String data) {
11+
return RequestBody.create(MediaType.parse("text/xml"), data);
12+
}
13+
14+
public static RequestBody form(String data) {
15+
return RequestBody.create(MediaType.parse("application/x-www-form-urlencoded"), data);
16+
}
17+
18+
public static RequestBody json(String data) {
19+
return RequestBody.create(MediaType.parse("application/json"), data);
20+
}
21+
22+
public static RequestBody jsonObj(Object data) {
23+
String json = Json.serializer().toString(data);
24+
return RequestBody.create(MediaType.parse("application/json"), json);
25+
}
26+
}
27+
// {{end:requestBodies}}
Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,186 @@
1+
package com.stubbornjava.examples.undertow.rest;
2+
3+
import java.time.LocalDate;
4+
import java.util.List;
5+
6+
import org.jooq.lambda.Unchecked;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
10+
import com.google.common.collect.Sets;
11+
import com.stubbornjava.common.HttpClient;
12+
import com.stubbornjava.common.Json;
13+
import com.stubbornjava.common.RequestBodies;
14+
import com.stubbornjava.examples.undertow.rest.User.Role;
15+
16+
import io.undertow.util.StatusCodes;
17+
import okhttp3.HttpUrl;
18+
import okhttp3.OkHttpClient;
19+
import okhttp3.Request;
20+
import okhttp3.Response;
21+
22+
public class RestClient {
23+
private static final Logger log = LoggerFactory.getLogger(RestClient.class);
24+
25+
// {{start:constructor}}
26+
private final String host;
27+
private final OkHttpClient client;
28+
public RestClient(String host, OkHttpClient client) {
29+
super();
30+
this.host = host;
31+
this.client = client;
32+
}
33+
// {{end:constructor}}
34+
35+
// {{start:listUsers}}
36+
public List<User> listUsers() {
37+
HttpUrl route = HttpUrl.parse(host + "/users");
38+
Request request = new Request.Builder().url(route).get().build();
39+
return Unchecked.supplier(() -> {
40+
try (Response response = client.newCall(request).execute()) {
41+
if (response.isSuccessful()) {
42+
List<User> users = Json.serializer().fromInputStream(response.body().byteStream(), User.listTypeRef());
43+
return users;
44+
}
45+
throw HttpClient.unknownException(response);
46+
}
47+
}).get();
48+
}
49+
// {{end:listUsers}}
50+
51+
// {{start:getUserByEmail}}
52+
public User getUserByEmail(String email) {
53+
HttpUrl route = HttpUrl.parse(host + "/users")
54+
.newBuilder()
55+
.addPathSegment(email)
56+
.build();
57+
Request request = new Request.Builder().url(route).get().build();
58+
return Unchecked.supplier(() -> {
59+
try (Response response = client.newCall(request).execute()) {
60+
// The user exists
61+
if (response.isSuccessful()) {
62+
User user = Json.serializer().fromInputStream(response.body().byteStream(), User.typeRef());
63+
return user;
64+
}
65+
66+
/*
67+
* 404 Not Found - Either return null or throw your own exception.
68+
* We prefer nulls.
69+
*/
70+
if (response.code() == StatusCodes.NOT_FOUND) {
71+
return null;
72+
}
73+
throw HttpClient.unknownException(response);
74+
}
75+
}).get();
76+
}
77+
// {{end:getUserByEmail}}
78+
79+
// {{start:deleteUserByEmail}}
80+
public boolean deleteUserByEmail(String email) {
81+
HttpUrl route = HttpUrl.parse(host + "/users")
82+
.newBuilder()
83+
.addPathSegment(email)
84+
.build();
85+
Request request = new Request.Builder().url(route).delete().build();
86+
return Unchecked.booleanSupplier(() -> {
87+
try (Response response = client.newCall(request).execute()) {
88+
if (response.code() == StatusCodes.NO_CONTENT) {
89+
return true;
90+
}
91+
92+
// Maybe you would throw an exception here? We don't feel the need to.
93+
if (response.code() == StatusCodes.NOT_FOUND) {
94+
return false;
95+
}
96+
throw HttpClient.unknownException(response);
97+
}
98+
}).getAsBoolean();
99+
}
100+
// {{end:deleteUserByEmail}}
101+
102+
// {{start:createUser}}
103+
public User createUser(User inputUser) {
104+
HttpUrl route = HttpUrl.parse(host + "/users");
105+
Request request = new Request.Builder()
106+
.url(route)
107+
.post(RequestBodies.jsonObj(inputUser))
108+
.build();
109+
return Unchecked.supplier(() -> {
110+
try (Response response = client.newCall(request).execute()) {
111+
if (response.code() == StatusCodes.CREATED) {
112+
User user = Json.serializer().fromInputStream(response.body().byteStream(), User.typeRef());
113+
return user;
114+
}
115+
116+
if (response.code() == StatusCodes.BAD_REQUEST) {
117+
return null;
118+
}
119+
throw HttpClient.unknownException(response);
120+
}
121+
}).get();
122+
}
123+
// {{end:createUser}}
124+
125+
// {{start:updateUser}}
126+
public User updateUser(User inputUser) {
127+
HttpUrl route = HttpUrl.parse(host + "/users");
128+
Request request = new Request.Builder()
129+
.url(route)
130+
.put(RequestBodies.jsonObj(inputUser))
131+
.build();
132+
return Unchecked.supplier(() -> {
133+
try (Response response = client.newCall(request).execute()) {
134+
if (response.isSuccessful()) {
135+
User user = Json.serializer().fromInputStream(response.body().byteStream(), User.typeRef());
136+
return user;
137+
}
138+
139+
if (response.code() == StatusCodes.NOT_FOUND) {
140+
return null;
141+
}
142+
throw HttpClient.unknownException(response);
143+
}
144+
}).get();
145+
}
146+
// {{end:updateUser}}
147+
148+
// {{start:main}}
149+
public static void main(String[] args) {
150+
RestClient client = new RestClient("http://localhost:8080", HttpClient.globalClient());
151+
152+
log.debug("**** Creating Users ****");
153+
User user1 = new User("user1@test.com", Sets.newHashSet(Role.USER), LocalDate.now());
154+
log.debug(Json.serializer().toString(client.createUser(user1)));
155+
User user2 = new User("user2@test.com", Sets.newHashSet(Role.ADMIN), LocalDate.now());
156+
log.debug(Json.serializer().toString(client.createUser(user2)));
157+
158+
log.debug("\n\n");
159+
log.debug("**** Updating User ****");
160+
User user2Updated = new User("user2@test.com", Sets.newHashSet(Role.ADMIN, Role.USER), LocalDate.now());
161+
log.debug(Json.serializer().toString(client.updateUser(user2Updated)));
162+
163+
log.debug("\n\n");
164+
log.debug("**** Listing Users ****");
165+
List<User> users = client.listUsers();
166+
log.debug(Json.serializer().toString(users));
167+
168+
log.debug("\n\n");
169+
log.debug("**** Get Users ****");
170+
log.debug(Json.serializer().toString(client.getUserByEmail("user1@test.com")));
171+
log.debug(Json.serializer().toString(client.getUserByEmail("user2@test.com")));
172+
173+
log.debug("\n\n");
174+
log.debug("**** Delete Users ****");
175+
client.deleteUserByEmail("user1@test.com");
176+
177+
log.debug("\n\n");
178+
log.debug("**** Get Missing User ****");
179+
log.debug(Json.serializer().toString(client.getUserByEmail("user1@test.com")));
180+
181+
log.debug("\n\n");
182+
log.debug("**** Exception ****");
183+
log.debug(Json.serializer().toString(client.createUser(null)));
184+
}
185+
// {{start:main}}
186+
}

stubbornjava-examples/src/main/java/com/stubbornjava/examples/undertow/rest/User.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.stubbornjava.examples.undertow.rest;
22

33
import java.time.LocalDate;
4+
import java.util.List;
45
import java.util.Set;
56

67
import com.fasterxml.jackson.annotation.JsonProperty;
@@ -42,5 +43,9 @@ public static enum Role {
4243
public static TypeReference<User> typeRef() {
4344
return typeRef;
4445
}
46+
private static final TypeReference<List<User>> listTypeRef = new TypeReference<List<User>>() {};
47+
public static TypeReference<List<User>> listTypeRef() {
48+
return listTypeRef;
49+
}
4550
}
4651
// {{end:user}}

0 commit comments

Comments
 (0)