/** * 解码application/x-www-form-urlencoded字符 * * @param content 被编码内容 * @return 编码后的字符 */ public static String decode(String content, String charset) { if (StrUtil.isBlank(content)) return content; String encodeContnt = null; try { encodeContnt = URLDecoder.decode(content, charset); } catch (UnsupportedEncodingException e) { throw new UtilException(StrUtil.format("Unsupported encoding: [{}]", charset), e); } return encodeContnt; }
/** * 将URL参数解析为Map(也可以解析Post中的键值对参数) * * @param paramsStr 参数字符串(或者带参数的Path) * @param charset 字符集 * @return 参数Map */ public static Map<String, List<String>> decodeParams(String paramsStr, String charset) { if (StrUtil.isBlank(paramsStr)) { return Collections.emptyMap(); } // 去掉Path部分 int pathEndPos = paramsStr.indexOf('?'); if (pathEndPos > 0) { paramsStr = StrUtil.subSuf(paramsStr, pathEndPos + 1); } paramsStr = decode(paramsStr, charset); final Map<String, List<String>> params = new LinkedHashMap<String, List<String>>(); String name = null; int pos = 0; // 未处理字符开始位置 int i; // 未处理字符结束位置 char c; // 当前字符 for (i = 0; i < paramsStr.length(); i++) { c = paramsStr.charAt(i); if (c == '=' && name == null) { // 键值对的分界点 if (pos != i) { name = paramsStr.substring(pos, i); } pos = i + 1; } else if (c == '&' || c == ';') { // 参数对的分界点 if (name == null && pos != i) { // 对于像&a&这类无参数值的字符串,我们将name为a的值设为"" addParam(params, paramsStr.substring(pos, i), StrUtil.EMPTY); } else if (name != null) { addParam(params, name, paramsStr.substring(pos, i)); name = null; } pos = i + 1; } } if (pos != i) { if (name == null) { addParam(params, paramsStr.substring(pos, i), StrUtil.EMPTY); } else { addParam(params, name, paramsStr.substring(pos, i)); } } else if (name != null) { addParam(params, name, StrUtil.EMPTY); } return params; }
/** * 从Http连接的头信息中获得字符集 * * @param conn HTTP连接对象 * @return 字符集 */ public static String getCharset(HttpURLConnection conn) { if (conn == null) { return null; } String charset = conn.getContentEncoding(); if (StrUtil.isBlank(charset)) { charset = ReUtil.get(CHARSET_PATTERN, conn.getContentType(), 1); } return charset; }
/** * 将表单数据字符串加到URL中(用于GET表单提交) * * @param url URL * @param queryString 表单数据字符串 * @return 拼接后的字符串 */ public static String urlWithForm(String url, String queryString) { if (StrUtil.isNotBlank(queryString)) { if (url.contains("?")) { // 原URL已经带参数 url += "&" + queryString; } url += url.endsWith("?") ? queryString : "?" + queryString; } return url; }
/** * 从流中读取内容 * * @param in 输入流 * @param charset 字符集 * @return 内容 * @throws IOException */ @SuppressWarnings("resource") public static String getString(InputStream in, String charset, boolean isGetCharsetFromContent) throws IOException { if (false == isGetCharsetFromContent) { return IoUtil.read(in, charset); } StringBuilder content = new StringBuilder(); // 存储返回的内容 // 从返回的内容中读取所需内容 BufferedReader reader = IoUtil.getReader(in, charset); String line = null; while ((line = reader.readLine()) != null) { content.append(line).append('\n'); String charsetInContent = ReUtil.get(CHARSET_PATTERN, line, 1); if (StrUtil.isNotBlank(charsetInContent)) { charset = charsetInContent; reader = IoUtil.getReader(in, charset); isGetCharsetFromContent = false; } } return content.toString(); }
/** * 检测给定字符串是否为未知,多用于检测HTTP请求相关<br> * * @param checkString 被检测的字符串 * @return 是否未知 */ public static boolean isUnknow(String checkString) { return StrUtil.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString); }