use of com.tvd12.ezyhttp.core.constant.HttpMethod in project ezyhttp by youngmonkeys.
the class HttpClient method request.
@SuppressWarnings("MethodLength")
public ResponseEntity request(HttpMethod method, String url, RequestEntity entity, Map<Integer, Class<?>> responseTypes, int connectTimeout, int readTimeout) throws Exception {
if (url == null) {
throw new IllegalArgumentException("url can not be null");
}
logger.debug("start: {} - {} - {}", method, url, entity != null ? entity.getHeaders() : null);
HttpURLConnection connection = connect(url);
try {
connection.setConnectTimeout(connectTimeout > 0 ? connectTimeout : defaultConnectTimeout);
connection.setReadTimeout(readTimeout > 0 ? readTimeout : defaultReadTimeout);
connection.setRequestMethod(method.toString());
connection.setDoInput(true);
connection.setDoOutput(method.hasOutput());
connection.setInstanceFollowRedirects(method == HttpMethod.GET);
MultiValueMap requestHeaders = entity != null ? entity.getHeaders() : null;
if (requestHeaders != null) {
Map<String, String> encodedHeaders = requestHeaders.toMap();
for (Entry<String, String> requestHeader : encodedHeaders.entrySet()) {
connection.setRequestProperty(requestHeader.getKey(), requestHeader.getValue());
}
}
Object requestBody = null;
if (method != HttpMethod.GET && entity != null) {
requestBody = entity.getBody();
}
byte[] requestBodyBytes = null;
if (requestBody != null) {
String requestContentType = connection.getRequestProperty(Headers.CONTENT_TYPE);
if (requestContentType == null) {
requestContentType = ContentTypes.APPLICATION_JSON;
connection.setRequestProperty(Headers.CONTENT_TYPE, ContentTypes.APPLICATION_JSON);
}
requestBodyBytes = serializeRequestBody(requestContentType, requestBody);
int requestContentLength = requestBodyBytes.length;
connection.setFixedLengthStreamingMode(requestContentLength);
}
connection.connect();
if (requestBodyBytes != null) {
if (method.hasOutput()) {
OutputStream outputStream = connection.getOutputStream();
outputStream.write(requestBodyBytes);
outputStream.flush();
outputStream.close();
} else {
throw new IllegalArgumentException(method + " method can not have a payload body");
}
}
int responseCode = connection.getResponseCode();
Map<String, List<String>> headerFields = connection.getHeaderFields();
MultiValueMap responseHeaders = MultiValueMap.of(headerFields);
String responseContentType = responseHeaders.getValue(Headers.CONTENT_TYPE);
if (responseContentType == null) {
responseContentType = ContentTypes.APPLICATION_JSON;
}
InputStream inputStream = responseCode >= 400 ? connection.getErrorStream() : connection.getInputStream();
Object responseBody = null;
if (inputStream != null) {
try {
int responseContentLength = connection.getContentLength();
Class<?> responseType = responseTypes.get(responseCode);
responseBody = deserializeResponseBody(responseContentType, responseContentLength, inputStream, responseType);
} finally {
inputStream.close();
}
}
logger.debug("end: {} - {} - {} - {}", method, url, responseCode, responseHeaders);
return new ResponseEntity(responseCode, responseHeaders, responseBody);
} finally {
connection.disconnect();
}
}
Aggregations