package org.nutz.http; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.net.URL; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.nutz.json.Json; import org.nutz.lang.Encoding; import org.nutz.lang.Lang; import org.nutz.lang.Strings; public class Request { public static enum METHOD { GET, POST, OPTIONS, PUT, DELETE, TRACE, CONNECT } public static Request get(String url) { return create(url, METHOD.GET, new HashMap<String, Object>()); } public static Request get(String url, Header header) { return Request.create(url, METHOD.GET, new HashMap<String, Object>(), header); } public static Request post(String url) { return create(url, METHOD.POST, new HashMap<String, Object>()); } public static Request post(String url, Header header) { return Request.create(url, METHOD.POST, new HashMap<String, Object>(), header); } public static Request create(String url, METHOD method) { return create(url, method, new HashMap<String, Object>()); } @SuppressWarnings("unchecked") public static Request create(String url, METHOD method, String paramsAsJson, Header header) { return create(url, method, (Map<String, Object>) Json.fromJson(paramsAsJson), header); } @SuppressWarnings("unchecked") public static Request create(String url, METHOD method, String paramsAsJson) { return create(url, method, (Map<String, Object>) Json.fromJson(paramsAsJson)); } public static Request create(String url, METHOD method, Map<String, Object> params) { return Request.create(url, method, params, Header.create()); } public static Request create(String url, METHOD method, Map<String, Object> params, Header header) { return new Request().setMethod(method).setParams(params).setUrl(url).setHeader(header); } private Request() {} private String url; private METHOD method; private Header header; private Map<String, Object> params; private byte[] data; private URL cacheUrl; private InputStream inputStream; private String enc; public URL getUrl() { if (cacheUrl != null) { return cacheUrl; } StringBuilder sb = new StringBuilder(url); try { if (this.isGet() && null != params && params.size() > 0) { sb.append(url.indexOf('?') > 0 ? '&' : '?'); sb.append(getURLEncodedParams()); } cacheUrl = new URL(sb.toString()); return cacheUrl; } catch (Exception e) { throw new HttpException(sb.toString(), e); } } public Map<String, Object> getParams() { return params; } public String getURLEncodedParams() { StringBuilder sb = new StringBuilder(); for (Iterator<String> it = params.keySet().iterator(); it.hasNext();) { String key = it.next(); sb.append(Http.encode(key)).append('=').append(Http.encode(params.get(key))); if (it.hasNext()) sb.append('&'); } return sb.toString(); } public InputStream getInputStream() { if (inputStream != null) { return inputStream; } else { if (null == data) { if (enc != null) try { return new ByteArrayInputStream(getURLEncodedParams().getBytes(enc)); } catch (UnsupportedEncodingException e) { throw Lang.wrapThrow(e); } return new ByteArrayInputStream(Strings.getBytesUTF8(getURLEncodedParams())); } return new ByteArrayInputStream(data); } } public void setInputStream(InputStream inputStream) { this.inputStream = inputStream; } public byte[] getData() { return data; } public void setData(byte[] data) { this.data = data; } public void setData(String data) { try { this.data = data.getBytes(Encoding.UTF8); } catch (UnsupportedEncodingException e) { // 不可能 } } private Request setParams(Map<String, Object> params) { this.params = params; return this; } public Request setUrl(String url) { if (url != null && url.indexOf("://") < 0) //默认采用http协议 this.url = "http://" + url; else this.url = url; return this; } public METHOD getMethod() { return method; } public boolean isGet() { return METHOD.GET == method; } public boolean isPost() { return METHOD.POST == method; } public Request setMethod(METHOD method) { this.method = method; return this; } public Header getHeader() { return header; } public Request setHeader(Header header) { this.header = header; return this; } public Request setCookie(Cookie cookie) { header.set("Cookie", cookie.toString()); return this; } public Cookie getCookie() { String s = header.get("Cookie"); if (null == s) return new Cookie(); return new Cookie(s); } /** * 设置发送内容的编码,仅对String或者Map<String,Object>类型的data有效 */ public Request setEnc(String reqEnc) { this.enc = reqEnc; return this; } }