Search in sources :

Example 11 with HttpMethod

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();
    }
}
Also used : InputStream(java.io.InputStream) OutputStream(java.io.OutputStream) FileOutputStream(java.io.FileOutputStream) ResponseEntity(com.tvd12.ezyhttp.core.response.ResponseEntity) HttpURLConnection(java.net.HttpURLConnection) ArrayList(java.util.ArrayList) List(java.util.List) MultiValueMap(com.tvd12.ezyhttp.core.data.MultiValueMap)

Aggregations

HttpMethod (com.tvd12.ezyhttp.core.constant.HttpMethod)4 HttpServletRequest (javax.servlet.http.HttpServletRequest)4 HttpServletResponse (javax.servlet.http.HttpServletResponse)4 RequestHandler (com.tvd12.ezyhttp.server.core.handler.RequestHandler)3 UnhandledErrorHandler (com.tvd12.ezyhttp.server.core.handler.UnhandledErrorHandler)3 Test (org.testng.annotations.Test)3 DeserializeValueException (com.tvd12.ezyhttp.core.exception.DeserializeValueException)2 HttpRequestException (com.tvd12.ezyhttp.core.exception.HttpRequestException)2 ResponseEntity (com.tvd12.ezyhttp.core.response.ResponseEntity)2 RequestURI (com.tvd12.ezyhttp.server.core.request.RequestURI)2 SimpleRequestArguments (com.tvd12.ezyhttp.server.core.request.SimpleRequestArguments)2 IOException (java.io.IOException)2 ArrayList (java.util.ArrayList)2 List (java.util.List)2 ServletException (javax.servlet.ServletException)2 EzyLoggable (com.tvd12.ezyfox.util.EzyLoggable)1 MultiValueMap (com.tvd12.ezyhttp.core.data.MultiValueMap)1 URITree (com.tvd12.ezyhttp.core.net.URITree)1 DoGet (com.tvd12.ezyhttp.server.core.annotation.DoGet)1 DoPost (com.tvd12.ezyhttp.server.core.annotation.DoPost)1