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

java 原生 HttpClient的更多相关文章

  1. 使用Java原生代理实现AOP

    ### 本文由博主柒.原创,转载请注明出处 ### 完整源码下载地址 [https://github.com/MatrixSeven/JavaAOP](https://github.com/Matri ...

  2. Java通过httpclient获取cookie模拟登录

    package Step1; import org.apache.commons.httpclient.Cookie; import org.apache.commons.httpclient.Htt ...

  3. android 学习随笔二十七(JNI:Java Native Interface,JAVA原生接口 )

    JNI(Java Native Interface,JAVA原生接口) 使用JNI可以使Java代码和其他语言写的代码(如C/C++代码)进行交互. 问:为什么要进行交互? 首先,Java语言提供的类 ...

  4. 【Java】Java原生的序列化和反序列化

    写一个Java原生的序列化和反序列化的DEMO. 需序列化的类: package com.nicchagil.nativeserialize; import java.io.Serializable; ...

  5. 使用Java原生代理实现数据注入

    本文由博主原创,转载请注明出处 完整源码下载地址 https://github.com/MatrixSeven/JavaAOP 上一篇,咱们说了使用Java原生代理实现AOP的简单例子,然么就不得不说 ...

  6. Java中httpClient中三种超时设置

    本文章给大家介绍一下关于Java中httpClient中的三种超时设置小结 在Apache的HttpClient包中,有三个设置超时的地方: /* 从连接池中取连接的超时时间*/ ConnManage ...

  7. 分布式架构探索 - 1. RPC框架之Java原生RMI

    1. 什么是RPC RPC(Remote Procedure Call)即远程过程调用,指的是不同机器间系统方法的调用,这和 同机器动态链接库(DLL)有点类似,只不过RPC是不同机器,通过网络通信来 ...

  8. Java使用HttpClient上传文件

    Java可以使用HttpClient发送Http请求.上传文件等,非常的方便 Maven <dependency> <groupId>org.apache.httpcompon ...

  9. java使用HttpClient

    HttpClient常用的包有两个 org.apache.http.client以及org.apache.commons.httpclient 我常用的是org.apache.http.client. ...

随机推荐

  1. <Jmeter入门不放弃>之<3.两种常见录制脚本的方法>

    关于录制,我想表达的是,并不要以为他很低端,解决需求才是王道,大家这里参考学习的时候,我就不在这里配截图了,因为需要你打开工具根据文档自己去找,才有印象,大家一定要启动JMeter!跟着理解操作 录制 ...

  2. vue2.0 组件的生命周期

    vue官方文档中给出的vue生命周期的流程图 如下: 生命周期探究 对于执行顺序和什么时候执行,看上面两个图基本有个了解了.下面我们将结合代码去看看钩子函数的执行. <!DOCTYPE html ...

  3. BZOJ 3653: 谈笑风生(主席树)

    传送门 解题思路 首先对于一个\(a\)来说,要求\(b\)和\(c\),那么\(a,b,c\)一定在一条链上.把\(b\)分类讨论,如果\(b\)是\(a\)的祖宗,这个方案数就很好统计了,就是\( ...

  4. 【Windows、SVN】在Windows服务器下安装SVN,并在客户端能维护代码版本

    1.分别在客户端和服务器端安装软件 在网上搜索一下安装包的下载地址(这里暂不介绍) 得到2个安装文件 Server是装在服务器端的,另外一个装在客户端 2.安装SVN服务器端 基本一致下一步即可 特殊 ...

  5. 修改Mysql procedure,function and view definer

    1 一次性修改遇到错误 update mysql.proc set definer='root@%'; update mysql.proc set definer='root@%'; ERROR 10 ...

  6. 2019牛客多校第七场C-Governing sand(线段树+枚举)

    Governing sand 题目传送门 解题思路 枚举每一种高度作为最大高度,则需要的最小花费的钱是:砍掉所有比这个高度高的树的所有花费+砍掉比这个高度低的树里最便宜的m棵树的花费,m为高度低的里面 ...

  7. HBase 入门之数据刷写(Memstore Flush)详细说明

    接触过 HBase 的同学应该对 HBase 写数据的过程比较熟悉(不熟悉也没关系).HBase 写数据(比如 put.delete)的时候,都是写 WAL(假设 WAL 没有被关闭) ,然后将数据写 ...

  8. array排序(按数组中对象的属性进行排序)

    使用array.sort()对数组中对象的属性进行排序 <template> <div> <a @click="sortArray()">降序& ...

  9. elementui表格表头合并

    第一步:用多级表头,该删删 该减减 第二步:使用header-cell-style属性

  10. log4j日志格式化

    Apache log4j 提供了各种布局对象,每一个对象都可以根据各种布局格式记录数据.另外,也可以创建一个布局对象格式化测井数据中的特定应用的方法. 所有的布局对象 - Appender对象收到 L ...