package org.aisen.wen.component.network.http; import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Params implements Serializable { private static final long serialVersionUID = 5990125562753037686L; private Map<String, String> mParameters = new HashMap<>(); private List<String> mKeys = new ArrayList<>(); // 某些时候,参数列表不需要进行编码,例如将参数作为URL QUERY时,防止进行了二次编码导致服务器不能解析 private boolean encodeAble = true; public Params() { } public Params(String[] keys, String[] values) { for (int i = 0; i < keys.length; i++) { String key = keys[i]; mKeys.add(key); mParameters.put(key, values[i]); } } public Params(String key, String value) { mKeys.add(key); mParameters.put(key, value); } public int size() { return mKeys.size(); } public boolean containsKey(String key) { return mKeys.contains(key); } public List<String> getKeys() { return mKeys; } public void add(String key, String value) { add(key, value, false); } public void add(String key, String value, boolean encode) { if (!mKeys.contains(key)) { mKeys.add(key); } if (encode) { value = encode(value); } mParameters.put(key, value); } public String get(String key) { return mParameters.get(key); } public Map<String, String> getVaules() { return mParameters; } public void remove(String key) { if (mKeys.contains(key)) { mKeys.remove(key); mParameters.remove(key); } } public void addParams(Params params) { for (String key : params.getKeys()) { if (!mKeys.contains(key)) { mKeys.add(key); } mParameters.put(key, params.get(key)); } } public boolean isEncodeAble() { return encodeAble; } public void setEncodeAble(boolean encodeAble) { this.encodeAble = encodeAble; } public void clearParams() { mParameters.clear(); mKeys.clear(); } @Override public String toString() { StringBuffer sb = new StringBuffer(); for (String key : mKeys) { sb.append(key).append("=").append(get(key)).append(","); } return sb.toString(); } public String toURLQuery() { return encodeParams(this, "&"); } private static String encodeParams(Params params, String splitStr) { StringBuffer paramsBuffer = new StringBuffer(); for (String key : params.getKeys()) { if (params.get(key) == null) continue; if (paramsBuffer.length() != 0) { paramsBuffer.append(splitStr); } paramsBuffer.append(key + "="); paramsBuffer.append(params.get(key)); paramsBuffer.append(params.isEncodeAble() ? encode(params.get(key)) : params.get(key)); } return paramsBuffer.toString(); } private static String encode(String value) { if (value == null) return ""; String encoded = null; try { encoded = URLEncoder.encode(value, "UTF-8"); } catch (UnsupportedEncodingException ignore) { } StringBuffer buf = new StringBuffer(encoded.length()); char focus; for (int i = 0; i < encoded.length(); i++) { focus = encoded.charAt(i); if (focus == '*') { buf.append("%2A"); } else if (focus == '+') { buf.append("%20"); } else if (focus == '%' && (i + 1) < encoded.length() && encoded.charAt(i + 1) == '7' && encoded.charAt(i + 2) == 'E') { buf.append('~'); i += 2; } else { buf.append(focus); } } return buf.toString(); } }