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

io.github.ydq.jquery.JQuery Maven / Gradle / Ivy

The newest version!
package io.github.ydq.jquery;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NonNull;
import lombok.Setter;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;

import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.Charset;
import java.security.cert.X509Certificate;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;

public class JQuery {

    private static final String EMPTY = "";

    public enum Method {
        GET, POST, PUT, DELETE
    }

    @AllArgsConstructor
    public enum ContentType {
        FORMDATA("application/x-www-form-urlencoded"), JSON("application/json"), XML("application/xml");
        @Getter
        String meta;
    }

    @Accessors(fluent = true)
    @FieldDefaults(level = AccessLevel.PRIVATE)
    public static class JQueryResponse {
        @Getter
        @Setter
        Integer                   code;
        @Getter
        Boolean                   status;
        @Getter
        byte[]                    data;
        @Getter
        @Setter
        Map> headers;
        @Getter
        String                    error;

        public JQueryResponse(Boolean status,Integer code, byte[] data,Map> headers) {
            this.status = status;
            this.code = code;
            this.data = data;
            this.headers = headers;
        }

        public JQueryResponse(Boolean status, String error) {
            this.status = status;
            this.error = error;
        }

        public String content() {
            return content(Charset.forName(CHARSET.get()));
        }

        public String content(Charset charset) {
            if (this.data == null) {
                return null;
            }
            return new String(this.data, charset);
        }

        public Map cookie() {
            if (this.headers != null) {
                List cookieStrs = headers.get("Set-Cookie");
                if (cookieStrs != null && cookieStrs.size() > 0) {
                    var cookie = new HashMap();
                    cookieStrs.stream().filter(JQuery::isNotBlank).forEach(str -> {
                        var cookieKV = str.split(";")[0].trim().split("=");
                        cookie.put(cookieKV[0], cookieKV[1]);
                    });
                    return cookie;
                }
            }
            return Collections.emptyMap();
        }

        public void then(@NonNull Consumer consumer) {
            consumer.accept(this);
        }

        public  R then(@NonNull Function func) {
            return func.apply(this);
        }
    }

    private static ThreadLocal CHARSET = ThreadLocal.withInitial(() -> "UTF-8");

    private static ThreadLocal USER_AGENT = ThreadLocal.withInitial(() -> "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko");

    private static ThreadLocal TIMEOUT = ThreadLocal.withInitial(() -> 5000);

    private static ThreadLocal METHOD = ThreadLocal.withInitial(() -> Method.GET);

    private static ThreadLocal CONTENT_TYPE = ThreadLocal.withInitial(() -> ContentType.FORMDATA);

    private static ThreadLocal> HEADER = ThreadLocal.withInitial(HashMap::new);

    private static ThreadLocal> COOKIE = ThreadLocal.withInitial(HashMap::new);

    private static ThreadLocal DEBUG = ThreadLocal.withInitial(() -> Boolean.FALSE);

    private static Boolean isBlank(CharSequence cs) {
        int csLen;
        if (cs == null || (csLen = cs.length()) == 0) {
            return Boolean.TRUE;
        }
        for (int i = 0; i < csLen; i++) {
            if (!Character.isWhitespace(cs.charAt(i))) {
                return Boolean.FALSE;
            }
        }
        return Boolean.TRUE;
    }

    private static Boolean isNotBlank(CharSequence cs) {
        return !isBlank(cs);
    }

    public static class $ {

        public static JQueryResponse get(@NonNull String url) {
            return get(url, EMPTY, null);
        }

        public static JQueryResponse get(@NonNull String url, @NonNull FormData formData) {
            return get(url, formData.toString(), null);
        }

        public static JQueryResponse get(@NonNull String url, @NonNull FormData formData, Consumer consumer) {
            return get(url, formData.toString(), consumer);
        }

        public static JQueryResponse get(@NonNull String url, String data) {
            return get(url, data, null);
        }

        public static JQueryResponse get(@NonNull String url, Consumer consumer) {
            return get(url, EMPTY, consumer);
        }

        public static JQueryResponse get(@NonNull String url, String data, Consumer consumer) {
            return ajax(url, data, consumer);
        }

        public static JQueryResponse post(@NonNull String url) {
            return post(url, EMPTY, null);
        }

        public static JQueryResponse post(@NonNull String url, @NonNull FormData formData) {
            return post(url, formData.toString(), null);
        }

        public static JQueryResponse post(@NonNull String url, @NonNull FormData formData, Consumer consumer) {
            return post(url, formData.toString(), consumer);
        }

        public static JQueryResponse post(@NonNull String url, String data) {
            return post(url, data, null);
        }

        public static JQueryResponse post(@NonNull String url, Consumer consumer) {
            return post(url, EMPTY, consumer);
        }

        public static JQueryResponse post(@NonNull String url, String data, Consumer consumer) {
            method(Method.POST);
            return ajax(url, data, consumer);
        }

        public static JQueryResponse ajax(String url, FormData data, Consumer consumer) {
            contentType(ContentType.FORMDATA);
            return ajax(url, data.toString(), consumer);
        }

        public static JQueryResponse ajax(@NonNull String url, String data, Consumer consumer) {
            if (METHOD.get() == Method.GET && !isBlank(data)) {
                url += url.indexOf("?") < 0 ? "?" : "&" + data;
            }
            JQueryResponse response = null;
            try {
                response = request(url, data);
            } catch (URISyntaxException | IOException | InterruptedException  e) {
                e.printStackTrace();
                response = new JQueryResponse(Boolean.FALSE, e.getMessage());
            }
            if (consumer != null) {
                consumer.accept(response);
            }
            return response;
        }

        private static JQueryResponse request(String url, String data) throws URISyntaxException, IOException, InterruptedException {
            debug(url, data);
            var reqBuilder = HttpRequest.newBuilder(new URI(url));
            reqBuilder.timeout(Duration.ofMillis(TIMEOUT.get()));
            reqBuilder.header("User-Agent", USER_AGENT.get());
            reqBuilder.header("Accept", "text/html,application/xhtml+xml,application/xml,application/json;q=0.9,image/webp,*/*;q=0.8");
            reqBuilder.header("Accept-Charset", CHARSET.get());
            HEADER.get().forEach(reqBuilder::header);
            if (COOKIE.get().size() > 0) {
                reqBuilder.header("Cookie", COOKIE.get().entrySet().stream().map(entry -> entry.getKey() + "=" + entry.getValue()).collect(Collectors.joining("; ")));
            }
            if (METHOD.get() == Method.POST || METHOD.get() == Method.PUT) {
                reqBuilder.header("Content-Type", CONTENT_TYPE.get().meta + ";charset=" + CHARSET.get());
                var bodyPublisher = HttpRequest.BodyPublishers.noBody();
                if (!isBlank(data)) {
                    bodyPublisher = HttpRequest.BodyPublishers.ofByteArray(data.getBytes(CHARSET.get()));
                }
                if(METHOD.get() == Method.POST){
                    reqBuilder.POST(bodyPublisher);
                } else {
                    reqBuilder.PUT(bodyPublisher);
                }
            } else {
                reqBuilder.header("Content-Type", "text/html,application/xml,application/json,text/json,image/png,image/jpeg,*/*;charset=" + CHARSET.get());
                if(METHOD.get() == Method.GET){
                    reqBuilder.GET();
                } else {
                    reqBuilder.DELETE();
                }
            }
            var client = HttpClient.newHttpClient();
            var resp = client.send(reqBuilder.build(), HttpResponse.BodyHandlers.ofByteArray());
            String redirect = resp.headers().firstValue("location").orElseGet(() -> EMPTY);
            if(!isBlank(redirect)){
                if(resp.statusCode() == 301 || resp.statusCode() ==302 || resp.statusCode() == 303){
                    $.method(Method.GET);
                    return request(redirect,EMPTY);
                }
                if(resp.statusCode() == 307){
                    return request(redirect,data);
                }
            }
            return new JQueryResponse(Boolean.TRUE,resp.statusCode(),resp.body(),resp.headers().map());
        }


        public static void charset(String charset) {
            CHARSET.set(charset);
        }

        public static void useragent(String useragent) {
            USER_AGENT.set(useragent);
        }

        public static void timeout(Integer timeout) {
            TIMEOUT.set(timeout);
        }

        public static void method(Method method) {
            METHOD.set(method);
        }

        public static void contentType(ContentType contentType) {
            CONTENT_TYPE.set(contentType);
        }

        public static void header(String name, String value) {
            HEADER.get().put(name, value);
        }

        public static void header(Map header) {
            HEADER.get().putAll(header);
        }

        public static void cookie(String name, String value) {
            COOKIE.get().put(name, value);
        }

        public static void cookie(Map cookie) {
            COOKIE.get().putAll(cookie);
        }

        public static void cookie(String cookieStr) {
            if (!isBlank(cookieStr)) {
                Arrays.asList(cookieStr.split(";")).forEach(ck -> {
                    var cookieKV = ck.trim().split("=");
                    COOKIE.get().put(cookieKV[0], cookieKV[1]);
                });
            }
        }

        public static Map cookie() {
            return COOKIE.get();
        }

        public static void debug(Boolean debug) {
            DEBUG.set(debug);
        }

        private static void debug(String url, String data) {
            if (DEBUG.get()) {
                System.out.println(String.format("\n\n\n>>>>>>  URL:\t\t\t%s\n>>>>>>  Method:\t\t\t%s\n>>>>>>  Param:\t\t\t%s\n>>>>>>  Cookie:\t\t\t%s\n>>>>>>  ContentType:\t%s\n>>>>>>  UserAgent:\t\t%s\n>>>>>>  Timeout:\t\t%s\n>>>>>>  Header:\t\t\t%s\n\n", url, METHOD.get(), data, COOKIE.get(), CONTENT_TYPE.get().meta, USER_AGENT.get(), TIMEOUT.get(), HEADER.get()));
            }
        }
    }

    public static FormData data(String key, Object val) {
        return new FormData().append(key, val);
    }

    public static FormData data(String k1, Object v1, String k2, Object v2) {
        return new FormData().append(k1, v1, k2, v2);
    }

    public static FormData data(String k1, Object v1, String k2, Object v2, String k3, Object v3) {
        return new FormData().append(k1, v1, k2, v2, k3, v3);
    }

    public static FormData data(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4) {
        return new FormData().append(k1, v1, k2, v2, k3, v3, k4, v4);
    }

    public static FormData data(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5) {
        return new FormData().append(k1, v1, k2, v2, k3, v3, k4, v4, k5, v5);
    }

    public static FormData data(Map data) {
        return new FormData().append(data);
    }

    public static class FormData {

        private List datas = new ArrayList<>();

        public FormData append(String key, Object val) {
            if (key != null && key.length() > 0)
                datas.add(new Data(key, val));
            return this;
        }

        public FormData append(String k1, Object v1, String k2, Object v2) {
            return append(k1, v1).append(k2, v2);
        }

        public FormData append(String k1, Object v1, String k2, Object v2, String k3, Object v3) {
            return append(k1, v1, k2, v2).append(k3, v3);
        }

        public FormData append(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4) {
            return append(k1, v1, k2, v2, k3, v3).append(k4, v4);
        }

        public FormData append(String k1, Object v1, String k2, Object v2, String k3, Object v3, String k4, Object v4, String k5, Object v5) {
            return append(k1, v1, k2, v2, k3, v3, k4, v4).append(k5, v5);
        }

        public FormData append(Map data) {
            data.entrySet().forEach(entry -> append(entry.getKey(), entry.getKey()));
            return this;
        }

        public String toString() {
            return datas.size() > 0 ? datas.stream().map(Data::toString).collect(Collectors.joining("&")) : JQuery.EMPTY;
        }

        @AllArgsConstructor
        public class Data {
            private String key;
            private Object val;

            public String toString() {
                return key + "=" + (val == null ? "" : val.toString());
            }
        }
    }

    private static class SSLTrustManager implements X509TrustManager {
        @Override
        public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {

        }

        @Override
        public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {

        }

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




© 2015 - 2025 Weber Informatics LLC | Privacy Policy