Skip to content

Commit 537efbb

Browse files
author
Amir Tocker
committed
Use "_method" with "delete" instead of HttpDelete.
1 parent 21ce474 commit 537efbb

File tree

2 files changed

+145
-117
lines changed

2 files changed

+145
-117
lines changed

cloudinary-http43/src/main/java/com/cloudinary/http43/ApiStrategy.java

Lines changed: 81 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,37 @@
11
package com.cloudinary.http43;
22

3-
import java.io.InputStream;
4-
import java.lang.reflect.Constructor;
5-
import java.net.URI;
6-
import java.util.Arrays;
7-
import java.util.Map;
8-
import java.util.concurrent.TimeUnit;
9-
3+
import com.cloudinary.Api;
4+
import com.cloudinary.Api.HttpMethod;
5+
import com.cloudinary.Cloudinary;
6+
import com.cloudinary.api.ApiResponse;
7+
import com.cloudinary.api.exceptions.GeneralError;
8+
import com.cloudinary.http43.api.Response;
9+
import com.cloudinary.utils.Base64Coder;
10+
import com.cloudinary.utils.ObjectUtils;
11+
import com.cloudinary.utils.StringUtils;
1012
import org.apache.http.HttpHost;
11-
import org.apache.http.client.methods.CloseableHttpResponse;
13+
import org.apache.http.NameValuePair;
1214
import org.apache.http.client.config.RequestConfig;
13-
import org.apache.http.client.methods.HttpDelete;
14-
import org.apache.http.client.methods.HttpGet;
15-
import org.apache.http.client.methods.HttpPost;
16-
import org.apache.http.client.methods.HttpPut;
17-
import org.apache.http.client.methods.HttpUriRequest;
15+
import org.apache.http.client.entity.UrlEncodedFormEntity;
16+
import org.apache.http.client.methods.*;
1817
import org.apache.http.client.utils.URIBuilder;
1918
import org.apache.http.conn.HttpClientConnectionManager;
2019
import org.apache.http.impl.client.CloseableHttpClient;
2120
import org.apache.http.impl.client.HttpClientBuilder;
2221
import org.apache.http.impl.client.HttpClients;
22+
import org.apache.http.message.BasicNameValuePair;
2323
import org.cloudinary.json.JSONException;
2424
import org.cloudinary.json.JSONObject;
2525

26-
import com.cloudinary.Api;
27-
import com.cloudinary.Uploader;
28-
import com.cloudinary.Api.HttpMethod;
29-
import com.cloudinary.Cloudinary;
30-
import com.cloudinary.api.ApiResponse;
31-
import com.cloudinary.api.exceptions.GeneralError;
32-
import com.cloudinary.http43.api.Response;
33-
import com.cloudinary.utils.Base64Coder;
34-
import com.cloudinary.utils.ObjectUtils;
35-
import com.cloudinary.utils.StringUtils;
26+
import java.io.InputStream;
27+
import java.io.UnsupportedEncodingException;
28+
import java.lang.reflect.Constructor;
29+
import java.net.URI;
30+
import java.net.URISyntaxException;
31+
import java.util.ArrayList;
32+
import java.util.Arrays;
33+
import java.util.List;
34+
import java.util.Map;
3635

3736
public class ApiStrategy extends com.cloudinary.strategies.AbstractApiStrategy {
3837

@@ -69,8 +68,9 @@ public void init(Api api) {
6968
}
7069

7170
@SuppressWarnings({"rawtypes", "unchecked"})
72-
public ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String, ? extends Object> params, Map options) throws Exception {
73-
if (options == null) options = ObjectUtils.emptyMap();
71+
public ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String, ?> params, Map options) throws Exception {
72+
if (options == null)
73+
options = ObjectUtils.emptyMap();
7474

7575
String prefix = ObjectUtils.asString(options.get("upload_prefix"), ObjectUtils.asString(this.api.cloudinary.config.uploadPrefix, "https://api.cloudinary.com"));
7676
String cloudName = ObjectUtils.asString(options.get("cloud_name"), this.api.cloudinary.config.cloudName);
@@ -85,33 +85,7 @@ public ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String,
8585
for (String component : uri) {
8686
apiUrl = apiUrl + "/" + component;
8787
}
88-
URIBuilder apiUrlBuilder = new URIBuilder(apiUrl);
89-
for (Map.Entry<String, ? extends Object> param : params.entrySet()) {
90-
if (param.getValue() instanceof Iterable) {
91-
for (String single : (Iterable<String>) param.getValue()) {
92-
apiUrlBuilder.addParameter(param.getKey() + "[]", single);
93-
}
94-
} else {
95-
apiUrlBuilder.addParameter(param.getKey(), ObjectUtils.asString(param.getValue()));
96-
}
97-
}
98-
99-
URI apiUri = apiUrlBuilder.build();
100-
HttpUriRequest request = null;
101-
switch (method) {
102-
case GET:
103-
request = new HttpGet(apiUri);
104-
break;
105-
case PUT:
106-
request = new HttpPut(apiUri);
107-
break;
108-
case POST:
109-
request = new HttpPost(apiUri);
110-
break;
111-
case DELETE:
112-
request = new HttpDelete(apiUri);
113-
break;
114-
}
88+
HttpUriRequest request = prepareRequest(method, apiUrl, params);
11589

11690
request.setHeader("Authorization", "Basic " + Base64Coder.encodeString(apiKey + ":" + apiSecret));
11791

@@ -147,4 +121,59 @@ public ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String,
147121
throw exceptionConstructor.newInstance(message);
148122
}
149123
}
124+
125+
/**
126+
* Prepare a request with the URL and parameters based on the HTTP method used
127+
* @param method the HTTP method: GET, PUT, POST, DELETE
128+
* @param apiUrl the cloudinary API URI
129+
* @param params the parameters to pass to the server
130+
* @return an HTTP request
131+
* @throws URISyntaxException
132+
* @throws UnsupportedEncodingException
133+
*/
134+
private HttpUriRequest prepareRequest(HttpMethod method, String apiUrl, Map<String, ?> params) throws URISyntaxException, UnsupportedEncodingException {
135+
URI apiUri;
136+
URIBuilder apiUrlBuilder = new URIBuilder(apiUrl);
137+
List<NameValuePair> parameters;
138+
HttpUriRequest request;
139+
parameters = prepareParams(params);
140+
if(method == HttpMethod.GET) {
141+
apiUrlBuilder.setParameters(parameters);
142+
apiUri = apiUrlBuilder.build();
143+
request = new HttpGet(apiUri);
144+
} else {
145+
apiUri = apiUrlBuilder.build();
146+
switch (method) {
147+
case PUT:
148+
request = new HttpPut(apiUri);
149+
break;
150+
case DELETE: //uses HttpPost instead of HttpDelete
151+
parameters.add(new BasicNameValuePair("_method", "delete"));
152+
//continue with POST
153+
case POST:
154+
request = new HttpPost(apiUri);
155+
break;
156+
default:
157+
throw new IllegalArgumentException("Unknown HTTP method");
158+
}
159+
((HttpEntityEnclosingRequestBase) request).setEntity(new UrlEncodedFormEntity(parameters));
160+
}
161+
return request;
162+
}
163+
164+
private List<NameValuePair> prepareParams(Map<String, ?> params) {
165+
List<NameValuePair> requestParams = new ArrayList<NameValuePair>(params.size());
166+
for (Map.Entry<String, ?> param : params.entrySet()) {
167+
if (param.getValue() instanceof Iterable) {
168+
for (Object single : (Iterable<?>) param.getValue()) {
169+
requestParams.add(new BasicNameValuePair(param.getKey() + "[]", ObjectUtils.asString(single)));
170+
}
171+
} else {
172+
requestParams.add(new BasicNameValuePair(param.getKey(), ObjectUtils.asString(param.getValue())));
173+
}
174+
}
175+
176+
177+
return requestParams;
178+
}
150179
}

cloudinary-http44/src/main/java/com/cloudinary/http44/ApiStrategy.java

Lines changed: 64 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
package com.cloudinary.http44;
22

3-
import java.io.InputStream;
4-
import java.io.UnsupportedEncodingException;
5-
import java.lang.reflect.Constructor;
6-
import java.net.URI;
7-
import java.net.URISyntaxException;
8-
import java.util.ArrayList;
9-
import java.util.Arrays;
10-
import java.util.List;
11-
import java.util.Map;
12-
3+
import com.cloudinary.Api;
4+
import com.cloudinary.Api.HttpMethod;
5+
import com.cloudinary.Cloudinary;
6+
import com.cloudinary.api.ApiResponse;
7+
import com.cloudinary.api.exceptions.GeneralError;
8+
import com.cloudinary.http44.api.Response;
9+
import com.cloudinary.utils.Base64Coder;
10+
import com.cloudinary.utils.ObjectUtils;
11+
import com.cloudinary.utils.StringUtils;
1312
import org.apache.http.HttpHost;
1413
import org.apache.http.NameValuePair;
14+
import org.apache.http.client.config.RequestConfig;
1515
import org.apache.http.client.entity.UrlEncodedFormEntity;
1616
import org.apache.http.client.methods.*;
17-
import org.apache.http.client.config.RequestConfig;
1817
import org.apache.http.client.utils.URIBuilder;
1918
import org.apache.http.conn.HttpClientConnectionManager;
2019
import org.apache.http.impl.client.CloseableHttpClient;
@@ -24,15 +23,15 @@
2423
import org.cloudinary.json.JSONException;
2524
import org.cloudinary.json.JSONObject;
2625

27-
import com.cloudinary.Api;
28-
import com.cloudinary.Api.HttpMethod;
29-
import com.cloudinary.Cloudinary;
30-
import com.cloudinary.api.ApiResponse;
31-
import com.cloudinary.api.exceptions.GeneralError;
32-
import com.cloudinary.http44.api.Response;
33-
import com.cloudinary.utils.Base64Coder;
34-
import com.cloudinary.utils.ObjectUtils;
35-
import com.cloudinary.utils.StringUtils;
26+
import java.io.InputStream;
27+
import java.io.UnsupportedEncodingException;
28+
import java.lang.reflect.Constructor;
29+
import java.net.URI;
30+
import java.net.URISyntaxException;
31+
import java.util.ArrayList;
32+
import java.util.Arrays;
33+
import java.util.List;
34+
import java.util.Map;
3635

3736
public class ApiStrategy extends com.cloudinary.strategies.AbstractApiStrategy {
3837

@@ -69,8 +68,7 @@ public void init(Api api) {
6968
}
7069

7170
@SuppressWarnings({"rawtypes", "unchecked"})
72-
public ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String, ? extends Object> params, Map options) throws Exception {
73-
URI apiUri;
71+
public ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String, ?> params, Map options) throws Exception {
7472
if (options == null)
7573
options = ObjectUtils.emptyMap();
7674

@@ -87,30 +85,7 @@ public ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String,
8785
for (String component : uri) {
8886
apiUrl = apiUrl + "/" + component;
8987
}
90-
URIBuilder apiUrlBuilder = new URIBuilder(apiUrl);
91-
HttpUriRequest request = null;
92-
93-
switch (method) {
94-
case GET:
95-
apiUri = prepareUrlParams(apiUrlBuilder, params);
96-
request = new HttpGet(apiUri);
97-
break;
98-
case PUT:
99-
apiUri = apiUrlBuilder.build();
100-
HttpEntityEnclosingRequestBase put = new HttpPut(apiUri);
101-
request = perpareEntityParams(put, params);
102-
103-
break;
104-
case POST:
105-
apiUri = apiUrlBuilder.build();
106-
HttpEntityEnclosingRequestBase post = new HttpPost(apiUri);
107-
request = perpareEntityParams(post, params);
108-
break;
109-
case DELETE:
110-
apiUri = prepareUrlParams(apiUrlBuilder, params);
111-
request = new HttpDelete(apiUri);
112-
break;
113-
}
88+
HttpUriRequest request = prepareRequest(method, apiUrl, params);
11489

11590
request.setHeader("Authorization", "Basic " + Base64Coder.encodeString(apiKey + ":" + apiSecret));
11691

@@ -147,34 +122,58 @@ public ApiResponse callApi(HttpMethod method, Iterable<String> uri, Map<String,
147122
}
148123
}
149124

150-
private HttpUriRequest perpareEntityParams(HttpEntityEnclosingRequestBase put, Map<String, ? extends Object> params) throws UnsupportedEncodingException {
151-
HttpUriRequest request;List<NameValuePair> entities = new ArrayList<NameValuePair>(params.size());
152-
for (Map.Entry<String, ? extends Object> param : params.entrySet()) {
153-
if (param.getValue() instanceof Iterable) {
154-
for (String single : (Iterable<String>) param.getValue()) {
155-
entities.add(new BasicNameValuePair(param.getKey() + "[]", single));
156-
}
157-
} else {
158-
entities.add(new BasicNameValuePair(param.getKey(), ObjectUtils.asString(param.getValue())));
125+
/**
126+
* Prepare a request with the URL and parameters based on the HTTP method used
127+
* @param method the HTTP method: GET, PUT, POST, DELETE
128+
* @param apiUrl the cloudinary API URI
129+
* @param params the parameters to pass to the server
130+
* @return an HTTP request
131+
* @throws URISyntaxException
132+
* @throws UnsupportedEncodingException
133+
*/
134+
private HttpUriRequest prepareRequest(HttpMethod method, String apiUrl, Map<String, ?> params) throws URISyntaxException, UnsupportedEncodingException {
135+
URI apiUri;
136+
URIBuilder apiUrlBuilder = new URIBuilder(apiUrl);
137+
List<NameValuePair> parameters;
138+
HttpUriRequest request;
139+
parameters = prepareParams(params);
140+
if(method == HttpMethod.GET) {
141+
apiUrlBuilder.setParameters(parameters);
142+
apiUri = apiUrlBuilder.build();
143+
request = new HttpGet(apiUri);
144+
} else {
145+
apiUri = apiUrlBuilder.build();
146+
switch (method) {
147+
case PUT:
148+
request = new HttpPut(apiUri);
149+
break;
150+
case DELETE: //uses HttpPost instead of HttpDelete
151+
parameters.add(new BasicNameValuePair("_method", "delete"));
152+
//continue with POST
153+
case POST:
154+
request = new HttpPost(apiUri);
155+
break;
156+
default:
157+
throw new IllegalArgumentException("Unknown HTTP method");
159158
}
159+
((HttpEntityEnclosingRequestBase) request).setEntity(new UrlEncodedFormEntity(parameters));
160160
}
161-
put.setEntity(new UrlEncodedFormEntity(entities));
162-
request = put;
163161
return request;
164162
}
165163

166-
private URI prepareUrlParams(URIBuilder urlBuilder, Map<String, ? extends Object> params) throws URISyntaxException {
167-
URI apiUri;
168-
for (Map.Entry<String, ? extends Object> param : params.entrySet()) {
164+
private List<NameValuePair> prepareParams(Map<String, ?> params) {
165+
List<NameValuePair> requestParams = new ArrayList<NameValuePair>(params.size());
166+
for (Map.Entry<String, ?> param : params.entrySet()) {
169167
if (param.getValue() instanceof Iterable) {
170-
for (String single : (Iterable<String>) param.getValue()) {
171-
urlBuilder.addParameter(param.getKey() + "[]", single);
168+
for (Object single : (Iterable<?>) param.getValue()) {
169+
requestParams.add(new BasicNameValuePair(param.getKey() + "[]", ObjectUtils.asString(single)));
172170
}
173171
} else {
174-
urlBuilder.addParameter(param.getKey(), ObjectUtils.asString(param.getValue()));
172+
requestParams.add(new BasicNameValuePair(param.getKey(), ObjectUtils.asString(param.getValue())));
175173
}
176174
}
177-
apiUri = urlBuilder.build();
178-
return apiUri;
175+
176+
177+
return requestParams;
179178
}
180179
}

0 commit comments

Comments
 (0)