package org.rx.socks.http;

import com.google.common.base.Strings;
import lombok.SneakyThrows;
import org.rx.common.App;
import org.rx.common.Contract;
import org.rx.common.SystemException;
import org.rx.socks.Sockets;
import org.rx.io.IOStream; import java.io.UnsupportedEncodingException;
import java.net.*;
import java.util.LinkedHashMap;
import java.util.Map; import static org.rx.common.Contract.eq;
import static org.rx.common.Contract.isNull; /**
* http://www.jianshu.com/p/aa3f066263ed
*/
public class HttpClient {
//region StaticMembers
@SneakyThrows
public static String urlEncode(String str) {
if (Strings.isNullOrEmpty(str)) {
return "";
} return URLEncoder.encode(str, Contract.Utf8).replace("+", "%20");
} public static Map<String, String> parseQueryString(String queryString) {
Map<String, String> map = new LinkedHashMap<>();
if (queryString == null) {
return map;
} String[] pairs = queryString.split("&");
try {
for (String pair : pairs) {
int idx = pair.indexOf("=");
String key = idx > 0 ? URLDecoder.decode(pair.substring(0, idx), Contract.Utf8) : pair;
String value = idx > 0 && pair.length() > idx + 1
? URLDecoder.decode(pair.substring(idx + 1), Contract.Utf8)
: null;
map.put(key, value);
}
} catch (UnsupportedEncodingException ex) {
throw SystemException.wrap(ex);
}
return map;
} public static String buildQueryString(String baseUrl, Map<String, String> params) {
if (params == null) {
return baseUrl;
}
if (baseUrl == null) {
baseUrl = "";
} String c = baseUrl.indexOf("?") == -1 ? "?" : "&";
StringBuilder url = new StringBuilder(baseUrl);
for (String key : params.keySet()) {
String val = params.get(key);
url.append(url.length() == baseUrl.length() ? c : "&").append(urlEncode(key)).append("=")
.append(val == null ? "" : urlEncode(val));
}
return url.toString();
}
//endregion public static final String GetMethod = "GET", PostMethod = "POST";
private static final String FormMimeType = "application/x-www-form-urlencoded", JsonMimeType = "application/json";
private static final String UserAgent = "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 5 Build/LMY48B; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/43.0.2357.65 Mobile Safari/537.36";
private String contentType;
private int timeout;
private String proxyHost; public String getContentType() {
return contentType;
} public void setContentType(String contentType) {
this.contentType = contentType;
} public int getTimeout() {
return timeout;
} public void setTimeout(int timeout) {
this.timeout = timeout;
} public String getProxyHost() {
return proxyHost;
} public void setProxyHost(String proxyHost) {
this.proxyHost = proxyHost;
} public HttpClient() {
timeout = App.TimeoutInfinite;
} public String httpGet(String url) {
return httpGet(url, null);
} public String httpGet(String url, Map<String, String> params) {
if (params != null && params.size() > 0) {
url = buildQueryString(url, params);
}
return exec(url, GetMethod, null, contentType, timeout);
} public String httpPost(String url, Map<String, String> params) {
contentType = FormMimeType;
return exec(url, PostMethod, buildQueryString("", params).substring(1), contentType, timeout);
} public String httpPost(String url, Object jsonEntity) {
contentType = JsonMimeType;
return exec(url, PostMethod, Contract.toJsonString(jsonEntity), contentType, timeout);
} private String exec(String url, String method, String content, String contentType, int timeout) {
String charset = Contract.Utf8;
try {
URL uri = new URL(url);
HttpURLConnection client = (HttpURLConnection) (proxyHost != null
? uri.openConnection(new Proxy(Proxy.Type.HTTP, Sockets.parseAddress(proxyHost)))
: uri.openConnection());
client.setDoOutput(true);
client.setDoInput(true);
client.setUseCaches(false);
client.setRequestProperty("User-Agent", UserAgent);
client.setRequestProperty("Accept-Charset", charset);
client.setRequestMethod(method);
if (!App.isNullOrEmpty(contentType)) {
client.setRequestProperty("Content-Type", contentType + ";charset=" + charset);
}
if (timeout > App.TimeoutInfinite) {
client.setConnectTimeout(timeout);
client.setReadTimeout(timeout);
}
client.connect();
if (eq(method, PostMethod) && !App.isNullOrEmpty(content)) {
IOStream.writeString(client.getOutputStream(), content, charset);
} int resCode = client.getResponseCode();
if (resCode != HttpURLConnection.HTTP_OK) { }
return IOStream.readString(client.getInputStream(), isNull(client.getContentEncoding(), charset));
} catch (Exception ex) {
throw SystemException.wrap(ex);
}
}
}

666   网购半价返利 http://f-li.cn

最新文章

  1. 【Windows编程】系列第七篇:Menubar的创建和使用
  2. 《Node.js实战(双色)》作者之一——吴中骅访谈录
  3. SQL语句中SUM与COUNT的区别
  4. python 练习 3
  5. DBA_Oracle冷备份案例脚本本法(案例)
  6. Notes of the scrum meeting(12.7)
  7. C#中的强制类型转换与as转换的区别
  8. 表达式:使用API创建表达式树(5)
  9. 一次完整的HTTP事务是怎样一个过程?(转)
  10. 乐在其中设计模式(C#) - 建造者模式(Builder Pattern)
  11. 飞信免费邮件api,飞信界面
  12. how tomcat works 札记(两)----------一个简单的servlet集装箱
  13. IIS 启用w3wp.exe调试 没有找到w3wp进程
  14. consul实现分布式锁
  15. cropper截图不压缩PHP上传裁剪后的图片
  16. LDAP&amp;it&#39;s usage
  17. 【BZOJ4813】[CQOI2017]小Q的棋盘(贪心)
  18. 将eclipse的maven项目导入到intellij idea中
  19. 将excel数据分块多线程导入
  20. System.Types.hpp(77): E2029 &#39;TObject&#39; must be a previously defined class or struct

热门文章

  1. css 导航菜单+下拉菜单
  2. Redis入门很简单之一【简介与环境搭建】
  3. Insmod模块加载过程分析
  4. 转-C++之string判断字符串是否包含某个子串
  5. python学习笔记:python简介和入门
  6. MySQL数据库学习初步
  7. 树的重心(DFS)
  8. python面试题之如何解决验证码的问题,用什么模块,听过哪些人工打码平台?
  9. Python之OS(系统操作)模块常用函数
  10. ASE: CODEnn Reproduce