Skip to content

Commit a0576aa

Browse files
committed
Change HTTP client from Unirest to okhttp
1 parent a3df12b commit a0576aa

28 files changed

+103
-86
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ The client is available in the [Maven Central Repository](https://mvnrepository.
1313
<dependency>
1414
<groupId>com.recombee</groupId>
1515
<artifactId>api-client</artifactId>
16-
<version>1.6.0</version>
16+
<version>1.6.1</version>
1717
</dependency>
1818
```
1919

pom.xml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@
3838

3939
<dependencies>
4040
<dependency>
41-
<groupId>com.mashape.unirest</groupId>
42-
<artifactId>unirest-java</artifactId>
43-
<version>1.4.9</version>
41+
<groupId>com.squareup.okhttp3</groupId>
42+
<artifactId>okhttp</artifactId>
43+
<version>3.9.1</version>
4444
</dependency>
4545
<dependency>
4646
<groupId>com.fasterxml.jackson.core</groupId>
@@ -62,6 +62,12 @@
6262
<artifactId>commons-lang</artifactId>
6363
<version>2.6</version>
6464
</dependency>
65+
<dependency>
66+
<groupId>commons-codec</groupId>
67+
<artifactId>commons-codec</artifactId>
68+
<version>1.10</version>
69+
</dependency>
70+
6571
</dependencies>
6672

6773

src/main/java/com/recombee/api_client/RecombeeClient.java

Lines changed: 54 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -3,28 +3,30 @@
33
import com.fasterxml.jackson.core.JsonProcessingException;
44
import com.fasterxml.jackson.databind.ObjectMapper;
55
import com.fasterxml.jackson.core.type.TypeReference;
6-
import java.text.SimpleDateFormat;
7-
8-
import com.mashape.unirest.http.HttpResponse;
9-
import com.mashape.unirest.http.Unirest;
10-
import com.mashape.unirest.http.exceptions.UnirestException;
11-
import com.mashape.unirest.request.HttpRequest;
126

7+
import okhttp3.MediaType;
8+
import okhttp3.OkHttpClient;
9+
import okhttp3.RequestBody;
10+
import okhttp3.Response;
1311

1412
import org.apache.commons.codec.binary.Hex;
1513
import javax.crypto.Mac;
1614
import javax.crypto.spec.SecretKeySpec;
17-
import java.io.IOException;
1815
import java.security.InvalidKeyException;
1916
import java.security.NoSuchAlgorithmException;
2017

18+
import java.io.IOException;
19+
import java.io.InterruptedIOException;
20+
import java.text.SimpleDateFormat;
21+
2122
import java.io.UnsupportedEncodingException;
2223
import java.net.URLEncoder;
2324

2425
import java.util.List;
2526
import java.util.ArrayList;
2627
import java.util.Map;
2728
import java.util.HashMap;
29+
import java.util.concurrent.TimeUnit;
2830

2931
import com.recombee.api_client.api_requests.Request;
3032
import com.recombee.api_client.exceptions.ApiException;
@@ -83,7 +85,9 @@ public class RecombeeClient {
8385

8486
final int BATCH_MAX_SIZE = 10000; //Maximal number of requests within one batch request
8587

86-
final String USER_AGENT = "recombee-java-api-client/1.6.0";
88+
final String USER_AGENT = "recombee-java-api-client/1.6.1";
89+
90+
private final OkHttpClient httpClient = new OkHttpClient();
8791

8892
public RecombeeClient(String databaseId, String token) {
8993
this.databaseId = databaseId;
@@ -756,40 +760,49 @@ public String send(Request request) throws ApiException {
756760
return sendRequest(request);
757761
}
758762

759-
protected String sendRequest(Request request) throws ApiException {
763+
private String sendRequest(Request request) throws ApiException {
760764
String signedUri = signUrl(processRequestUri(request));
761765
String protocolStr = request.getEnsureHttps() ? "https" : this.defaultProtocol.name().toLowerCase();
762766
String uri = protocolStr + "://" + this.baseUri + "/" + signedUri;
763-
Unirest.setTimeouts(request.getTimeout(), request.getTimeout());
764767

765-
HttpRequest httpRequest = null;
768+
OkHttpClient tempClient = this.httpClient.newBuilder()
769+
.connectTimeout(request.getTimeout(), TimeUnit.MILLISECONDS)
770+
.readTimeout(request.getTimeout(), TimeUnit.MILLISECONDS)
771+
.writeTimeout(request.getTimeout(), TimeUnit.MILLISECONDS)
772+
.build();
773+
774+
775+
okhttp3.Request.Builder httpRequestBuilder = new okhttp3.Request.Builder()
776+
.url(uri)
777+
.addHeader("User-Agent", this.USER_AGENT);
778+
779+
766780
switch (request.getHTTPMethod()) {
767781
case GET:
768-
httpRequest = get(uri);
769782
break;
770783
case POST:
771-
httpRequest = post(uri, request);
784+
httpRequestBuilder = post(httpRequestBuilder, request);
772785
break;
773786
case PUT:
774-
httpRequest = put(uri, request);
787+
httpRequestBuilder = put(httpRequestBuilder, request);
775788
break;
776789
case DELETE:
777-
httpRequest = delete(uri);
790+
httpRequestBuilder.delete();
778791
break;
779792
}
780793

794+
781795
try {
782-
HttpResponse<String> response = httpRequest.asString();
796+
Response response = tempClient.newCall(httpRequestBuilder.build()).execute();
783797
checkErrors(response, request);
784-
return response.getBody();
785-
} catch (UnirestException e) {
786-
if(e.getCause() != null && (e.getCause() instanceof org.apache.http.conn.ConnectTimeoutException
787-
||e.getCause() instanceof java.net.SocketTimeoutException)) {
788-
throw new ApiTimeoutException(request);
789-
}
798+
return response.body().string();
799+
}
800+
catch (InterruptedIOException e) {
801+
throw new ApiTimeoutException(request);
802+
}
803+
catch (IOException e) {
790804
e.printStackTrace();
791805
}
792-
793806
return null;
794807
}
795808

@@ -834,41 +847,39 @@ private String formatQueryParameterValue(Object val) {
834847
}
835848
}
836849

837-
private HttpRequest get(String url) {
838-
return Unirest.get(url).header("User-Agent", this.USER_AGENT);
839-
}
840-
841-
private HttpRequest put(String url, Request req) {
850+
private okhttp3.Request.Builder put(okhttp3.Request.Builder reqBuilder, Request req) {
842851
try {
843852
String json = this.mapper.writeValueAsString(req.getBodyParameters());
844-
return Unirest.put(url).header("Content-Type", "application/json").
845-
header("User-Agent", this.USER_AGENT).
846-
body(json.getBytes()).getHttpRequest();
853+
final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
854+
reqBuilder.put(RequestBody.create(JSON, json))
855+
.addHeader("Content-Type", "application/json; charset=utf-8");
856+
return reqBuilder;
847857
} catch (JsonProcessingException e) {
848858
e.printStackTrace();
849859
}
850860
return null;
851861
}
852862

853-
private HttpRequest delete(String url) {
854-
return Unirest.delete(url).header("User-Agent", this.USER_AGENT);
855-
}
856-
857-
private HttpRequest post(String url, Request req) {
863+
private okhttp3.Request.Builder post(okhttp3.Request.Builder reqBuilder, Request req) {
858864
try {
859865
String json = this.mapper.writeValueAsString(req.getBodyParameters());
860-
return Unirest.post(url).header("Content-Type", "application/json").
861-
header("User-Agent", this.USER_AGENT).
862-
body(json.getBytes()).getHttpRequest();
866+
final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
867+
reqBuilder.post(RequestBody.create(JSON, json))
868+
.addHeader("Content-Type", "application/json; charset=utf-8");
869+
return reqBuilder;
863870
} catch (JsonProcessingException e) {
864871
e.printStackTrace();
865872
}
866873
return null;
867874
}
868875

869-
private void checkErrors(HttpResponse<String> response, Request request) throws ResponseException {
870-
if(response.getStatus() == 200 || response.getStatus() == 201) return;
871-
throw new ResponseException(request, response.getStatus(), response.getBody());
872-
876+
private void checkErrors(Response response, Request request) throws ResponseException {
877+
if(response.code() == 200 || response.code() == 201) return;
878+
try {
879+
throw new ResponseException(request, response.code(), response.body().string());
880+
} catch (IOException e) {
881+
e.printStackTrace();
882+
throw new ResponseException(request, response.code(), "Failed to read the error from response");
883+
}
873884
}
874885
}

src/main/java/com/recombee/api_client/api_requests/RecommendItemsToItem.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public class RecommendItemsToItem extends Request {
6666
* Example response:
6767
* ```
6868
* {
69-
* "recommId": "8ac80708afe9148130528757ebf6aaba",
69+
* "recommId": "0c6189e7-dc1a-429a-b613-192696309361",
7070
* "recomms":
7171
* [
7272
* {
@@ -97,7 +97,7 @@ public class RecommendItemsToItem extends Request {
9797
* Example response for `includedProperties=description,price`:
9898
* ```
9999
* {
100-
* "recommId": "c7dbfc503d262b80b77b4949ee9855fb",
100+
* "recommId": "6842c725-a79f-4537-a02c-f34d668a3f80",
101101
* "recomms":
102102
* [
103103
* {
@@ -210,7 +210,7 @@ public RecommendItemsToItem setScenario(String scenario) {
210210
* Example response:
211211
* ```
212212
* {
213-
* "recommId": "8ac80708afe9148130528757ebf6aaba",
213+
* "recommId": "0c6189e7-dc1a-429a-b613-192696309361",
214214
* "recomms":
215215
* [
216216
* {
@@ -245,7 +245,7 @@ public RecommendItemsToItem setReturnProperties(boolean returnProperties) {
245245
* Example response for `includedProperties=description,price`:
246246
* ```
247247
* {
248-
* "recommId": "c7dbfc503d262b80b77b4949ee9855fb",
248+
* "recommId": "6842c725-a79f-4537-a02c-f34d668a3f80",
249249
* "recomms":
250250
* [
251251
* {

src/main/java/com/recombee/api_client/api_requests/RecommendItemsToUser.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public class RecommendItemsToUser extends Request {
4646
* Example response:
4747
* ```
4848
* {
49-
* "recommId": "1644e7b31759a08480da5f3b0a13045b",
49+
* "recommId": "ce52ada4-e4d9-4885-943c-407db2dee837",
5050
* "recomms":
5151
* [
5252
* {
@@ -77,7 +77,7 @@ public class RecommendItemsToUser extends Request {
7777
* Example response for `includedProperties=description,price`:
7878
* ```
7979
* {
80-
* "recommId": "e3ba43af1a4e59dd08a00adced1729a7",
80+
* "recommId": "a86ee8d5-cd8e-46d1-886c-8b3771d0520b",
8181
* "recomms":
8282
* [
8383
* {
@@ -168,7 +168,7 @@ public RecommendItemsToUser setScenario(String scenario) {
168168
* Example response:
169169
* ```
170170
* {
171-
* "recommId": "1644e7b31759a08480da5f3b0a13045b",
171+
* "recommId": "ce52ada4-e4d9-4885-943c-407db2dee837",
172172
* "recomms":
173173
* [
174174
* {
@@ -203,7 +203,7 @@ public RecommendItemsToUser setReturnProperties(boolean returnProperties) {
203203
* Example response for `includedProperties=description,price`:
204204
* ```
205205
* {
206-
* "recommId": "e3ba43af1a4e59dd08a00adced1729a7",
206+
* "recommId": "a86ee8d5-cd8e-46d1-886c-8b3771d0520b",
207207
* "recomms":
208208
* [
209209
* {

src/main/java/com/recombee/api_client/api_requests/RecommendUsersToItem.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public class RecommendUsersToItem extends Request {
4646
* Example response:
4747
* ```
4848
* {
49-
* "recommId": "9eeebc318508302529e3241f4570834d",
49+
* "recommId": "039b71dc-b9cc-4645-a84f-62b841eecfce",
5050
* "recomms":
5151
* [
5252
* {
@@ -73,7 +73,7 @@ public class RecommendUsersToItem extends Request {
7373
* Example response for `includedProperties=country`:
7474
* ```
7575
* {
76-
* "recommId": "d4c826635efc3e01a83470008c5697f1",
76+
* "recommId": "b2b355dd-972a-4728-9c6b-2dc229db0678",
7777
* "recomms":
7878
* [
7979
* {
@@ -110,7 +110,7 @@ public class RecommendUsersToItem extends Request {
110110
public RecommendUsersToItem (String itemId,long count) {
111111
this.itemId = itemId;
112112
this.count = count;
113-
this.timeout = 3000;
113+
this.timeout = 50000;
114114
}
115115

116116
/**
@@ -150,7 +150,7 @@ public RecommendUsersToItem setScenario(String scenario) {
150150
* Example response:
151151
* ```
152152
* {
153-
* "recommId": "9eeebc318508302529e3241f4570834d",
153+
* "recommId": "039b71dc-b9cc-4645-a84f-62b841eecfce",
154154
* "recomms":
155155
* [
156156
* {
@@ -181,7 +181,7 @@ public RecommendUsersToItem setReturnProperties(boolean returnProperties) {
181181
* Example response for `includedProperties=country`:
182182
* ```
183183
* {
184-
* "recommId": "d4c826635efc3e01a83470008c5697f1",
184+
* "recommId": "b2b355dd-972a-4728-9c6b-2dc229db0678",
185185
* "recomms":
186186
* [
187187
* {

src/main/java/com/recombee/api_client/api_requests/RecommendUsersToUser.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public class RecommendUsersToUser extends Request {
4646
* Example response:
4747
* ```
4848
* {
49-
* "recommId": "32fc671480eb29d843e47def43503992",
49+
* "recommId": "9cb9c55d-50ba-4478-84fd-ab456136156e",
5050
* "recomms":
5151
* [
5252
* {
@@ -73,7 +73,7 @@ public class RecommendUsersToUser extends Request {
7373
* Example response for `includedProperties=country`:
7474
* ```
7575
* {
76-
* "recommId": "27d81ade643621f45cc6ba5d30d7d683",
76+
* "recommId": "b326d82d-5d57-4b45-b362-c9d6f0895855",
7777
* "recomms":
7878
* [
7979
* {
@@ -122,7 +122,7 @@ public class RecommendUsersToUser extends Request {
122122
public RecommendUsersToUser (String userId,long count) {
123123
this.userId = userId;
124124
this.count = count;
125-
this.timeout = 3000;
125+
this.timeout = 50000;
126126
}
127127

128128
/**
@@ -162,7 +162,7 @@ public RecommendUsersToUser setScenario(String scenario) {
162162
* Example response:
163163
* ```
164164
* {
165-
* "recommId": "32fc671480eb29d843e47def43503992",
165+
* "recommId": "9cb9c55d-50ba-4478-84fd-ab456136156e",
166166
* "recomms":
167167
* [
168168
* {
@@ -193,7 +193,7 @@ public RecommendUsersToUser setReturnProperties(boolean returnProperties) {
193193
* Example response for `includedProperties=country`:
194194
* ```
195195
* {
196-
* "recommId": "27d81ade643621f45cc6ba5d30d7d683",
196+
* "recommId": "b326d82d-5d57-4b45-b362-c9d6f0895855",
197197
* "recomms":
198198
* [
199199
* {

src/test/java/com/recombee/api_client/AddGroupBatchTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class AddGroupBatchTest extends RecombeeTestCase {
2323
public void testAddGroup() throws ApiException {
2424
Request[] requests = new Request[] {
2525
new AddGroup("valid_id"),
26-
new AddGroup("...not_valid..."),
26+
new AddGroup("$$$not_valid$$$"),
2727
new AddGroup("valid_id2"),
2828
new AddGroup("valid_id2")
2929
};

src/test/java/com/recombee/api_client/AddGroupTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public void testAddGroup() throws ApiException {
2828
req = new AddGroup("valid_id");
2929
resp = this.client.send(req);
3030
// it 'fails with invalid entity id'
31-
req = new AddGroup("...not_valid...");
31+
req = new AddGroup("$$$not_valid$$$");
3232
try {
3333
this.client.send(req);
3434
fail("No exception thrown");

src/test/java/com/recombee/api_client/AddItemBatchTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public class AddItemBatchTest extends RecombeeTestCase {
2323
public void testAddItem() throws ApiException {
2424
Request[] requests = new Request[] {
2525
new AddItem("valid_id"),
26-
new AddItem("...not_valid..."),
26+
new AddItem("$$$not_valid$$$"),
2727
new AddItem("valid_id2"),
2828
new AddItem("valid_id2")
2929
};

0 commit comments

Comments
 (0)