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

shz.core.net.HttpHelp Maven / Gradle / Ivy

package shz.core.net;

import shz.core.*;

import javax.net.ssl.SSLContext;
import javax.net.ssl.X509TrustManager;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookieStore;
import java.security.*;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.Map;

/**
 * GET(幂等) 一般来说应该只用于数据的读取,而不应当用于会产生副作用的非幂等的操作中
 * HEAD(幂等) 与GET方法一样,都是向服务器发出指定资源的请求。但是,服务器在响应HEAD请求时不会回传资源的内容部分,即:响应主体。
 * 这样,我们可以不传输全部内容的情况下,就可以获取服务器的响应头信息。HEAD方法常被用于客户端查看服务器的性能
 * POST 向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等,请求数据会被包含在请求体中。
 * 是非幂等的方法,因为这个请求可能会创建新的资源或修改现有资源
 * PUT(幂等) 向指定资源位置上传其最新内容,通过该方法客户端可以将指定资源的最新数据传送给服务器取代指定的资源的内容
 * DELETE(幂等) 用于请求服务器删除所请求URI(统一资源标识符,Uniform Resource Identifier)所标识的资源。DELETE请求后指定资源会被删除
 * CONNECT 是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接与非加密的HTTP代理服务器的通信。
 * OPTIONS(幂等) 与HEAD类似,一般也是用于客户端查看服务器的性能。 这个方法会请求服务器返回该资源所支持的所有HTTP请求方法,该方法会用’*’来代替资源名称,
 * 向服务器发送OPTIONS请求,可以测试服务器功能是否正常。JavaScript的XMLHttpRequest对象进行CORS跨域资源共享时,就是使用OPTIONS方法发送嗅探请求,以判断是否有对指定资源的访问权限
 * TRACE 请求服务器回显其收到的请求信息,该方法主要用于HTTP请求的测试或诊断
 * PATCH(幂等) 方法出现的较晚,它在2010年的RFC 5789标准中被定义。PATCH请求与PUT请求类似,同样用于资源的更新。二者有以下两点不同:
 * 1、PATCH一般用于资源的部分更新,而PUT一般用于资源的整体更新。
 * 2、当资源不存在时,PATCH会创建一个新的资源,而PUT只会对已在资源进行更新
 */
public final class HttpHelp {
    private HttpHelp() {
        throw new IllegalStateException();
    }

    public static String jointUrl(String url, Map params) {
        if (NullHelp.isEmpty(params)) return url;
        StringBuilder sb = new StringBuilder();
        sb.append(url).append(url.contains("?") ? '&' : '?');
        params.forEach((k, v) -> sb.append(Coder.urlEncode(k)).append('=').append(Coder.urlEncode(String.valueOf(v))).append('&'));
        return sb.substring(0, sb.length() - 1);
    }

    public static String formatUrl(String url) {
        int idx = url.indexOf("://");
        return url.substring(0, idx + 3) + url.substring(idx + 3).replaceAll("/{2,}", "/");
    }

    public static SSLContext getDefaultSSLContext(Certificate... certificates) {
        try {
            SSLContext context = SSLContext.getInstance("TLS");
            context.init(null, Arrays.stream(certificates).map(SSL509TrustManager::new).toArray(SSL509TrustManager[]::new), null);
            return context;
        } catch (NoSuchAlgorithmException | KeyManagementException e) {
            return null;
        }
    }

    private static final class SSL509TrustManager implements X509TrustManager {
        final Certificate certificate;

        SSL509TrustManager(Certificate certificate) {
            this.certificate = certificate;
        }

        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) {
        }

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
            for (X509Certificate cert : chain) {
                cert.checkValidity();
                try {
                    cert.verify(certificate.getPublicKey());
                } catch (NoSuchAlgorithmException | InvalidKeyException | NoSuchProviderException |
                         SignatureException e) {
                    throw new CertificateException(e.getMessage(), e);
                }
            }
        }

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
    }

    public static void setDefaultCookieHandler(CookieStore store, CookiePolicyEnum cookiePolicy) {
        CookieHandler.setDefault(new CookieManager(store, cookiePolicy));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy