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

top.jfunc.http.request.HttpRequest Maven / Gradle / Ivy

package top.jfunc.http.request;

import top.jfunc.common.utils.MapUtil;
import top.jfunc.common.utils.MultiValueMap;
import top.jfunc.http.base.MediaType;
import top.jfunc.http.base.Method;
import top.jfunc.http.base.ProxyInfo;
import top.jfunc.http.config.Config;
import top.jfunc.http.config.ConfigAccessor;
import top.jfunc.http.ssl.SSLSocketFactoryBuilder;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.X509TrustManager;
import java.io.InputStream;
import java.net.URL;
import java.util.Map;

/**
 * Http请求的基本定义
 * 子类都要重写clone方法,使其实现类具备clone能力
 * @since 1.1.6
 * @author xiongshiyan at 2019/5/18 , contact me with email [email protected] or phone 15208384257
 */
public interface HttpRequest extends ConfigAccessor, Cloneable{
    /**
     * 请求的URL
     * @return 请求的URL
     */
    String getUrl();

    /**
     * 获取真正请求的URL,可能是经过一系列处理的
     * @since 1.2.0
     * @return 真正请求的URL
     */
    String getCompletedUrl();

    /**
     * 设置URL
     * @param url url
     * @return this
     */
    HttpRequest setUrl(String url);

    /**
     * 设置URL
     * @param url URL
     * @return this
     */
    default HttpRequest setUrl(URL url){
        return setUrl(url.toString());
    }

    /**
     * 获取设置的路径参数map
     * @return 路径参数,可能为空
     */
    Map getRouteParams();

    /**
     * 便捷地设置路径参数
     * @param key key
     * @param value value
     * @return this
     */
    HttpRequest addRouteParam(String key, String value);

    /**
     * 便捷地设置路径参数
     * @param routeParams 多个路径参数
     * @return this
     */
    HttpRequest setRouteParams(Map routeParams);

    /**
     * 获取设置的Query参数
     * @return Query参数
     */
    MultiValueMap getQueryParams();

    /**
     * 获取Query参数编码
     * @return Query参数编码
     */
    String getQueryParamCharset();

    /**
     * 设置Query参数编码
     * @param paramCharset 参数编码
     * @return this
     */
    HttpRequest setQueryParamCharset(String paramCharset);

    /**
     * 提供便捷的设置Query参数的方法
     * @param key key
     * @param value value
     * @param values values
     * @return this
     */
    HttpRequest addQueryParam(String key, String value, String... values);

    /**
     * 设置QueryParam参数
     * @param params Param参数
     * @return this
     */
    HttpRequest setQueryParams(MultiValueMap params);

    /**
     * 设置QueryParam参数
     * @param params Param参数
     * @return this
     */
    HttpRequest setQueryParams(Map params);

    /**
     * 请求的Header
     * @return 请求的Header
     */
    MultiValueMap getHeaders();

    default MultiValueMap mergedHeaders(){
        Config config = getConfig();
        Config.throwExIfNull(config);
        return MapUtil.mergeMap(getHeaders() , config.getDefaultHeaders());
    }

    /**
     * 便捷的设置header的方法,set方式,相同key就会覆盖
     * @param key key
     * @param value value
     * @return this
     */
    HttpRequest setHeader(String key, String value);

    /**
     * 提供便捷的设置header的方法,add方式,相同key那么value就成为多值
     * @param key key
     * @param value value
     * @param values values
     * @return this
     */
    HttpRequest addHeader(String key, String value, String... values);

    /**
     * 有些请求可能经过一些处理之后需要改变header重新设置回去
     * @param headers 处理过后的header
     * @return this
     */
    HttpRequest setHeaders(MultiValueMap headers);

    /**
     * 设置header
     * @param headers headerHolder
     * @return this
     */
    HttpRequest setHeaders(Map headers);

    /**
     * Content-Type
     * @return Content-Type
     */
    String getContentType();

    /**
     * 设置Content-Type
     * 对于HttpURLConnection和OkHttp3来说,Content-Type非常重要,
     * 前者根据Content-Type的编码来输出流,后者直接需要指定Content-Type,
     * 所以建议的最佳实践为:在需要发送body的时候都指定Content-Type
     * @see HttpRequest#setContentType(MediaType)
     * @param contentType Content-Type
     * @return this
     */
    HttpRequest setContentType(String contentType);

    /**
     * 设置Content-Type
     * @see MediaType
     * @param mediaType Content-Type
     * @return this
     */
    default HttpRequest setContentType(MediaType mediaType){
        return setContentType(mediaType.toString());
    }

    /**
     * 连接超时时间 ms
     * -1表示使用系统默认的
     * @return 连接超时时间 ms
     */
    int getConnectionTimeout();

    /**
     * 设置connectionTimeout
     * @param connectionTimeout connectionTimeout -1表示使用系统默认的
     * @return this
     */
    HttpRequest setConnectionTimeout(int connectionTimeout);

    /**
     * 读超时时间 ms
     * -1表示使用系统默认的
     * @return 读超时时间 ms
     */
    int getReadTimeout();

    /**
     * 设置readTimeout
     * @param readTimeout readTimeout -1表示使用系统默认的
     * @return this
     */
    HttpRequest setReadTimeout(int readTimeout) ;

    /**
     * 结果字符编码
     * @return 结果字符编码
     */
    String getResultCharset();

    /**
     * 设置resultCharset
     * @param resultCharset resultCharset
     * @return this
     */
    HttpRequest setResultCharset(String resultCharset);

    /**
     * 响应中是否包含header
     * 返回值返回Boolean,是为了表示未指定的情况
     * @return 响应中是否包含header
     */
    Boolean retainResponseHeaders();

    /**
     * 设置retainResponseHeaders
     * @see Config#RETAIN_RESPONSE_HEADERS
     * @param retainResponseHeaders 是|否
     * @return this
     */
    HttpRequest retainResponseHeaders(Boolean retainResponseHeaders);

    /**
     * 是否忽略响应体,在不需要响应体的场景下提高效率
     * @return 是否忽略响应体
     */
    Boolean ignoreResponseBody();

    /**
     * 设置ignoreResponseBody
     * @see Config#IGNORE_RESPONSE_BODY
     * @param ignoreResponseBody 是|否
     * @return this
     */
    HttpRequest ignoreResponseBody(Boolean ignoreResponseBody);

    /**
     * 是否重定向
     * @return 是否重定向
     */
    Boolean followRedirects();

    /**
     * 设置是否支持重定向
     * @see Config#FOLLOW_REDIRECTS
     * @param followRedirects 是否支持重定向
     * @return this
     */
    HttpRequest followRedirects(Boolean followRedirects);

    /**
     * 代理信息
     * @see java.net.Proxy
     * @return 代理信息
     */
    ProxyInfo getProxyInfo();

    /**
     * 设置proxyInfo
     * @param proxyInfo proxyInfo
     * @return this
     */
    HttpRequest setProxy(ProxyInfo proxyInfo);

    /**
     * HostnameVerifier
     * @return HostnameVerifier
     */
    HostnameVerifier getHostnameVerifier();

    /**
     * 设置HostnameVerifier
     * @param hostnameVerifier HostnameVerifier
     * @return this
     */
    HttpRequest setHostnameVerifier(HostnameVerifier hostnameVerifier);

    /**
     * SSLContext
     * @return SSLContext
     */
    SSLContext getSslContext();

    /**
     * 设置 SSLContext
     * @see SSLSocketFactoryBuilder#getSSLContext()
     * @see SSLSocketFactoryBuilder#getSSLContext(String, String)
     * @see SSLSocketFactoryBuilder#getSSLContext(InputStream, String)
     * @param sslContext SSLContext
     * @return this
     */
    HttpRequest setSslContext(SSLContext sslContext);

    /**
     * SSLSocketFactory
     * 因为一般地 SslSocketFactory 都是从sslContext产生出来的 , 所以废弃其set方法,从sslContext产生
     * @return SSLSocketFactory
     */
    default SSLSocketFactory getSslSocketFactory(){
        SSLContext sslContext = getSslContext();
        return null == sslContext ? null : sslContext.getSocketFactory();
    }

    /**
     * X509TrustManager
     * @return X509TrustManager
     */
    X509TrustManager getX509TrustManager();

    /**
     * 设置X509TrustManager
     * @param x509TrustManager X509TrustManager
     * @return this
     */
    HttpRequest setX509TrustManager(X509TrustManager x509TrustManager);

    /**
     * 添加属性
     * @param key key
     * @param value value
     * @return this
     */
    HttpRequest addAttribute(String key, Object value);

    /**
     * 获取属性
     * @param key key
     * @return 属性值
     */
    Object getAttribute(String key);
    @SuppressWarnings("unchecked")
    default  A getAttributeAs(String key){
        Object attribute = getAttribute(key);
        if(null == attribute){
            return null;
        }
        return (A)attribute;
    }

    /**
     * 获取设置的属性,maybe null
     * @return 属性map
     */
    Map getAttributes();

    /**
     * 获取设置的Method
     * @since 1.2.0
     * @return Method
     */
    Method getMethod();

    /**
     * 设置Method
     * 此方法一般在接口入口处由框架调用,用户自己设置的就以用户的为准,一般不需要设置
     * @since 1.2.0
     * @param method Method
     * @return this
     */
    HttpRequest setMethod(Method method);
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy