package com.xiaoleilu.hutool.http; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import com.xiaoleilu.hutool.util.CharsetUtil; import com.xiaoleilu.hutool.util.CollectionUtil; import com.xiaoleilu.hutool.util.StrUtil; /** * http基类 * @author Looly * @param <T> 子类类型,方便链式编程 */ @SuppressWarnings("unchecked") public abstract class HttpBase<T> { /**HTTP/1.0*/ public static final String HTTP_1_0 = "HTTP/1.0"; /**HTTP/1.1*/ public static final String HTTP_1_1 = "HTTP/1.1"; /**存储头信息*/ protected Map<String, List<String>> headers = new HashMap<String, List<String>>(); /**编码*/ protected String charset = CharsetUtil.UTF_8; /**http版本*/ protected String httpVersion = HTTP_1_1; /**存储主体*/ protected String body; // ---------------------------------------------------------------- Headers start /** * 根据name获取头信息 * @param name Header名 * @return Header值 */ public String header(String name) { if(StrUtil.isBlank(name)) { return null; } List<String> values = headers.get(name.trim()); if(CollectionUtil.isEmpty(values)) { return null; } return values.get(0); } /** * 根据name获取头信息 * @param name Header名 * @return Header值 */ public String header(Header name) { return header(name.toString()); } /** * 移除一个头信息 * @param name Header名 * @return this */ public T removeHeader(String name) { if(name != null) { headers.remove(name.trim()); } return (T)this; } /** * 移除一个头信息 * @param name Header名 * @return this */ public T removeHeader(Header name) { return removeHeader(name.toString()); } /** * 设置一个header<br> * 如果覆盖模式,则替换之前的值,否则加入到值列表中 * @param name Header名 * @param value Header值 * @param isOverride 是否覆盖已有值 * @return T 本身 */ public T header(String name, String value, boolean isOverride) { if(null != name && null != value){ final List<String> values = headers.get(name.trim()); if(isOverride || CollectionUtil.isEmpty(values)) { final ArrayList<String> valueList = new ArrayList<String>(); valueList.add(value); headers.put(name.trim(), valueList); }else { values.add(value.trim()); } } return (T) this; } /** * 设置一个header<br> * 如果覆盖模式,则替换之前的值,否则加入到值列表中 * @param name Header名 * @param value Header值 * @param isOverride 是否覆盖已有值 * @return T 本身 */ public T header(Header name, String value, boolean isOverride) { return header(name.toString(), value, isOverride); } /** * 设置一个header<br> * 覆盖模式,则替换之前的值 * @param name Header名 * @param value Header值 * @return T 本身 */ public T header(Header name, String value) { return header(name.toString(), value, true); } /** * 设置一个header<br> * 覆盖模式,则替换之前的值 * @param name Header名 * @param value Header值 * @return T 本身 */ public T header(String name, String value) { return header(name, value, true); } /** * 设置请求头<br> * 不覆盖原有请求头 * * @param headers 请求头 */ public T header(Map<String, List<String>> headers) { if(CollectionUtil.isEmpty(headers)) { return (T)this; } String name; for (Entry<String, List<String>> entry : headers.entrySet()) { name = entry.getKey(); for (String value : entry.getValue()) { this.header(name, StrUtil.nullToEmpty(value), false); } } return (T)this; } /** * 获取headers * @return Map<String, List<String>> */ public Map<String, List<String>> headers() { return Collections.unmodifiableMap(headers); } // ---------------------------------------------------------------- Headers end /** * 返回http版本 * @return String */ public String httpVersion() { return httpVersion; } /** * 设置http版本 * @param httpVersion * @return T */ public T httpVersion(String httpVersion) { this.httpVersion = httpVersion; return (T) this; } /** * 返回字符集 * @return 字符集 */ public String charset() { return charset; } /** * 设置字符集 * @param charset 字符集 * @return T 自己 */ public T charset(String charset) { if(StrUtil.isNotBlank(charset)){ this.charset = charset; } return (T) this; } /** * 设置字符集 * @param charset 字符集 * @return T 自己 */ public T charset(Charset charset) { if(null != charset){ this.charset = charset.name(); } return (T) this; } @Override public String toString() { StringBuilder sb = StrUtil.builder(); sb.append("Request Headers: ").append(StrUtil.CRLF); for (Entry<String, List<String>> entry : this.headers.entrySet()) { sb.append(" ").append(entry).append(StrUtil.CRLF); } sb.append("Request Body: ").append(StrUtil.CRLF); sb.append(" ").append(this.body).append(StrUtil.CRLF); return sb.toString(); } }