All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.alibaba.nacos.common.http.client.NacosRestTemplate Maven / Gradle / Ivy

There is a newer version: 2.4.2
Show newest version
/*
 * Copyright 1999-2018 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.alibaba.nacos.common.http.client;

import com.alibaba.nacos.common.http.HttpClientConfig;
import com.alibaba.nacos.common.http.HttpRestResult;
import com.alibaba.nacos.common.http.HttpUtils;
import com.alibaba.nacos.common.http.client.handler.ResponseHandler;
import com.alibaba.nacos.common.http.client.request.DefaultHttpClientRequest;
import com.alibaba.nacos.common.http.client.request.HttpClientRequest;
import com.alibaba.nacos.common.http.client.request.JdkHttpClientRequest;
import com.alibaba.nacos.common.http.client.response.HttpClientResponse;
import com.alibaba.nacos.common.http.param.Header;
import com.alibaba.nacos.common.http.param.MediaType;
import com.alibaba.nacos.common.http.param.Query;
import com.alibaba.nacos.common.model.RequestHttpEntity;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.alibaba.nacos.common.utils.HttpMethod;
import org.slf4j.Logger;

import java.lang.reflect.Type;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Nacos rest template Interface specifying a basic set of RESTful operations.
 *
 * @author mai.jh
 * @see HttpClientRequest
 * @see HttpClientResponse
 */
public class NacosRestTemplate extends AbstractNacosRestTemplate {
    
    private final HttpClientRequest requestClient;
    
    private final List interceptors = new ArrayList<>();
    
    public NacosRestTemplate(Logger logger, HttpClientRequest requestClient) {
        super(logger);
        this.requestClient = requestClient;
    }
    
    /**
     * http get URL request params are expanded using the given query {@link Query}.
     *
     * 

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * * @param url url * @param header http header param * @param query http query param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult get(String url, Header header, Query query, Type responseType) throws Exception { return execute(url, HttpMethod.GET, new RequestHttpEntity(header, query), responseType); } /** * http get URL request params are expanded using the given query {@link Query}. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * *

{@code config} Specify the request config via {@link HttpClientConfig} * * @param url url * @param config http config * @param header headers * @param query http query param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult get(String url, HttpClientConfig config, Header header, Query query, Type responseType) throws Exception { RequestHttpEntity requestHttpEntity = new RequestHttpEntity(config, header, query); return execute(url, HttpMethod.GET, requestHttpEntity, responseType); } /** * get request, may be pulling a lot of data URL request params are expanded using the given query {@link Query}, * More request parameters can be set via body. * *

This method can only be used when HttpClientRequest is implemented by {@link DefaultHttpClientRequest}, note: * {@link JdkHttpClientRequest} Implementation does not support this method. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * * @param url url * @param header http header param * @param query http query param * @param body get with body * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult getLarge(String url, Header header, Query query, Object body, Type responseType) throws Exception { return execute(url, HttpMethod.GET_LARGE, new RequestHttpEntity(header, query, body), responseType); } /** * http delete URL request params are expanded using the given query {@link Query}. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * * @param url url * @param header http header param * @param query http query param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult delete(String url, Header header, Query query, Type responseType) throws Exception { return execute(url, HttpMethod.DELETE, new RequestHttpEntity(header, query), responseType); } /** * http delete URL request params are expanded using the given query {@link Query}. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * *

{@code config} Specify the request config via {@link HttpClientConfig} * * @param url url * @param config http config * @param header http header param * @param query http query param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult delete(String url, HttpClientConfig config, Header header, Query query, Type responseType) throws Exception { return execute(url, HttpMethod.DELETE, new RequestHttpEntity(config, header, query), responseType); } /** * http put Create a new resource by PUTting the given body to http request. * *

URL request params are expanded using the given query {@link Query}. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * * @param url url * @param header http header param * @param query http query param * @param body http body param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult put(String url, Header header, Query query, Object body, Type responseType) throws Exception { return execute(url, HttpMethod.PUT, new RequestHttpEntity(header, query, body), responseType); } /** * http put json Create a new resource by PUTting the given body to http request, http header contentType default * 'application/json;charset=UTF-8'. * *

URL request params are expanded using the given query {@link Query}. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * * @param url url * @param header http header param * @param query http query param * @param body http body param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult putJson(String url, Header header, Query query, String body, Type responseType) throws Exception { RequestHttpEntity requestHttpEntity = new RequestHttpEntity(header.setContentType(MediaType.APPLICATION_JSON), query, body); return execute(url, HttpMethod.PUT, requestHttpEntity, responseType); } /** * http put json Create a new resource by PUTting the given body to http request, http header contentType default * 'application/json;charset=UTF-8'. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * * @param url url * @param header http header param * @param body http body param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult putJson(String url, Header header, String body, Type responseType) throws Exception { RequestHttpEntity requestHttpEntity = new RequestHttpEntity(header.setContentType(MediaType.APPLICATION_JSON), body); return execute(url, HttpMethod.PUT, requestHttpEntity, responseType); } /** * http put from Create a new resource by PUTting the given map {@code bodyValues} to http request, http header * contentType default 'application/x-www-form-urlencoded;charset=utf-8'. * *

URL request params are expanded using the given query {@code Query}. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * * @param url url * @param header http header param * @param query http query param * @param bodyValues http body param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult putForm(String url, Header header, Query query, Map bodyValues, Type responseType) throws Exception { RequestHttpEntity requestHttpEntity = new RequestHttpEntity( header.setContentType(MediaType.APPLICATION_FORM_URLENCODED), query, bodyValues); return execute(url, HttpMethod.PUT, requestHttpEntity, responseType); } /** * http put from Create a new resource by PUTting the given map {@code bodyValues} to http request, http header * contentType default 'application/x-www-form-urlencoded;charset=utf-8'. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * * @param url url * @param header http header param * @param bodyValues http body param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult putForm(String url, Header header, Map bodyValues, Type responseType) throws Exception { RequestHttpEntity requestHttpEntity = new RequestHttpEntity( header.setContentType(MediaType.APPLICATION_FORM_URLENCODED), bodyValues); return execute(url, HttpMethod.PUT, requestHttpEntity, responseType); } /** * http put from Create a new resource by PUTting the given map {@code bodyValues} to http request, http header * contentType default 'application/x-www-form-urlencoded;charset=utf-8'. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * *

{@code config} Specify the request config via {@link HttpClientConfig} * * @param url url * @param config http config * @param header http header param * @param bodyValues http body param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult putForm(String url, HttpClientConfig config, Header header, Map bodyValues, Type responseType) throws Exception { RequestHttpEntity requestHttpEntity = new RequestHttpEntity(config, header.setContentType(MediaType.APPLICATION_FORM_URLENCODED), bodyValues); return execute(url, HttpMethod.PUT, requestHttpEntity, responseType); } /** * http post Create a new resource by POSTing the given object to the http request. * *

URL request params are expanded using the given query {@link Query}. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * * @param url url * @param header http header param * @param query http query param * @param body http body param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult post(String url, Header header, Query query, Object body, Type responseType) throws Exception { return execute(url, HttpMethod.POST, new RequestHttpEntity(header, query, body), responseType); } /** * http post json Create a new resource by POSTing the given object to the http request, http header contentType * default 'application/json;charset=UTF-8'. * *

URL request params are expanded using the given query {@link Query}. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * * @param url url * @param header http header param * @param query http query param * @param body http body param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult postJson(String url, Header header, Query query, String body, Type responseType) throws Exception { RequestHttpEntity requestHttpEntity = new RequestHttpEntity(header.setContentType(MediaType.APPLICATION_JSON), query, body); return execute(url, HttpMethod.POST, requestHttpEntity, responseType); } /** * http post json Create a new resource by POSTing the given object to the http request, http header contentType * default 'application/json;charset=UTF-8'. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * * @param url url * @param header http header param * @param body http body param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult postJson(String url, Header header, String body, Type responseType) throws Exception { RequestHttpEntity requestHttpEntity = new RequestHttpEntity(header.setContentType(MediaType.APPLICATION_JSON), body); return execute(url, HttpMethod.POST, requestHttpEntity, responseType); } /** * http post from Create a new resource by PUTting the given map {@code bodyValues} to http request, http header * contentType default 'application/x-www-form-urlencoded;charset=utf-8'. * *

URL request params are expanded using the given query {@link Query}. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * * @param url url * @param header http header param * @param query http query param * @param bodyValues http body param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult postForm(String url, Header header, Query query, Map bodyValues, Type responseType) throws Exception { RequestHttpEntity requestHttpEntity = new RequestHttpEntity( header.setContentType(MediaType.APPLICATION_FORM_URLENCODED), query, bodyValues); return execute(url, HttpMethod.POST, requestHttpEntity, responseType); } /** * http post from Create a new resource by PUTting the given map {@code bodyValues} to http request, http header * contentType default 'application/x-www-form-urlencoded;charset=utf-8'. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * * @param url url * @param header http header param * @param bodyValues http body param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult postForm(String url, Header header, Map bodyValues, Type responseType) throws Exception { RequestHttpEntity requestHttpEntity = new RequestHttpEntity( header.setContentType(MediaType.APPLICATION_FORM_URLENCODED), bodyValues); return execute(url, HttpMethod.POST, requestHttpEntity, responseType); } /** * http post from Create a new resource by PUTting the given map {@code bodyValues} to http request, http header * contentType default 'application/x-www-form-urlencoded;charset=utf-8'. * *

{@code responseType} can be an HttpRestResult or HttpRestResult data {@code T} type. * *

{@code config} Specify the request config via {@link HttpClientConfig} * * @param url url * @param config http config * @param header http header param * @param bodyValues http body param * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult postForm(String url, HttpClientConfig config, Header header, Map bodyValues, Type responseType) throws Exception { RequestHttpEntity requestHttpEntity = new RequestHttpEntity(config, header.setContentType(MediaType.APPLICATION_FORM_URLENCODED), bodyValues); return execute(url, HttpMethod.POST, requestHttpEntity, responseType); } /** * Execute the HTTP method to the given URI template, writing the given request entity to the request, and returns * the response as {@link HttpRestResult}. * * @param url url * @param header http header param * @param query http query param * @param bodyValues http body param * @param httpMethod http method * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult exchangeForm(String url, Header header, Query query, Map bodyValues, String httpMethod, Type responseType) throws Exception { RequestHttpEntity requestHttpEntity = new RequestHttpEntity( header.setContentType(MediaType.APPLICATION_FORM_URLENCODED), query, bodyValues); return execute(url, httpMethod, requestHttpEntity, responseType); } /** * Execute the HTTP method to the given URI template, writing the given request entity to the request, and returns * the response as {@link HttpRestResult}. * * @param url url * @param config HttpClientConfig * @param header http header param * @param query http query param * @param body http body param * @param httpMethod http method * @param responseType return type * @return {@link HttpRestResult} * @throws Exception ex */ public HttpRestResult exchange(String url, HttpClientConfig config, Header header, Query query, Object body, String httpMethod, Type responseType) throws Exception { RequestHttpEntity requestHttpEntity = new RequestHttpEntity(config, header, query, body); return execute(url, httpMethod, requestHttpEntity, responseType); } /** * Set the request interceptors that this accessor should use. * * @param interceptors {@link HttpClientRequestInterceptor} */ public void setInterceptors(List interceptors) { if (this.interceptors != interceptors) { this.interceptors.clear(); this.interceptors.addAll(interceptors); } } /** * Return the request interceptors that this accessor uses. * *

The returned {@link List} is active and may get appended to. */ public List getInterceptors() { return interceptors; } @SuppressWarnings("unchecked") private HttpRestResult execute(String url, String httpMethod, RequestHttpEntity requestEntity, Type responseType) throws Exception { URI uri = HttpUtils.buildUri(url, requestEntity.getQuery()); if (logger.isDebugEnabled()) { logger.debug("HTTP method: {}, url: {}, body: {}", httpMethod, uri, requestEntity.getBody()); } ResponseHandler responseHandler = super.selectResponseHandler(responseType); HttpClientResponse response = null; try { response = this.requestClient().execute(uri, httpMethod, requestEntity); return responseHandler.handle(response); } finally { if (response != null) { response.close(); } } } private HttpClientRequest requestClient() { if (CollectionUtils.isNotEmpty(interceptors)) { if (logger.isDebugEnabled()) { logger.debug("Execute via interceptors :{}", interceptors); } return new InterceptingHttpClientRequest(requestClient, interceptors.iterator()); } return requestClient; } /** * close request client. */ public void close() throws Exception { requestClient.close(); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy