DwUtil.java 4.0 KB
package com.aukey.example.util;

import org.springframework.util.StringUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.Objects;

/**
 * @author: wgf
 * @create: 2020-05-13 11:21
 * @description:
 * 关于 java url 编码问题
 * Java官方的URLEncoder.encode 实际上是为了post请求的content-type为x-www-form-urlencoded来设计的
 * 在进行特殊参数转义的时候会将空格转为 +
 * 但是在 RFC1738、RFC2396协议中规定,GET请求的空格转为为 %20
 * 所以在发送GET请求的特殊参数中存在空格必须 先URLEncoder.encode 然后再用 %20替换掉所有+
 **/
public class DwUtil {
    private DwUtil() {
    }

    /**
     * GET请求
     *
     * @param urlStr 请求url
     * @param params 请求参数
     * @return
     */
    public static String doGet(String urlStr, Map<String, Object> params) {

        if (StringUtils.isEmpty(urlStr)) {
            return null;
        }

        HttpURLConnection connection = null;
        InputStream       is         = null;
        BufferedReader    br         = null;
        String            result     = null;

        try {
            StringBuilder sb = new StringBuilder(urlStr);
            if (params != null && !params.isEmpty()) {
                boolean isFirst = true;

                for (Map.Entry<String, Object> entry : params.entrySet()) {

                    if (Objects.isNull(entry.getValue())) {
                        continue;
                    }

                    if (isFirst) {
                        sb.append("?");
                        isFirst = false;
                    } else {
                        sb.append("&");
                    }

                    // 兼容参数特殊符号
                    String value = String.valueOf(entry.getValue());
                    value = URLEncoder.encode(value, "UTF-8");
                    value = value.replaceAll("\\+", "%20");

                    sb.append(entry.getKey())
                            .append("=")
                            .append(value);
                }

                urlStr = sb.toString();
            }

            URL url = new URL(urlStr);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setConnectTimeout(15000);
            connection.setReadTimeout(60000);
            connection.connect();
            int responseCode = connection.getResponseCode();
            if (responseCode == 200) {
                is = connection.getInputStream();
                br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8));
                StringBuilder sbf = new StringBuilder();
                String        temp;
                while ((temp = br.readLine()) != null) {
                    sbf.append(temp);
                    sbf.append("\r\n");
                }
                result = sbf.toString();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (null != br) {
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (null != is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

            if (connection != null) {
                connection.disconnect();// 关闭远程连接
            }
        }

        return result;
    }


    /**
     * @param dwDoMain 数据仓库域名
     * @param api      数据仓库申请的API
     * @param params   参数
     * @return
     */
    public static String doGet(String dwDoMain, String api, Map<String, Object> params) {
        return doGet(dwDoMain + api, params);
    }
}