另外一个版本: http://www.cnblogs.com/wenbronk/p/6671928.html

在java代码中调用http请求, 并将返回的参数进行处理

get请求:

    public static String doGet(String getUrl) throws IOException {
String str = null;
try {
CloseableHttpClient httpclient = HttpClients.createDefault();
// HttpClient httpclient = new DefaultHttpClient();
// HttpGet("http://www.wenbronk.com/geosot-basis/getGeoNum?lng=21.12&lat=1&geoLevel=17");
HttpGet httpgets = new HttpGet(getUrl);
HttpResponse response = httpclient.execute(httpgets);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instreams = entity.getContent();
str = convertStreamToString(instreams);
httpgets.abort();
}
}catch (Exception e) { }
return str;
}

最开始使用了过时的类DefaultHttpClient, 结果引发一大堆问题, 后台改成了CloseableHttpClient

post请求: 传入参数为字符串, 这里为业务需求所以传入的为json格式的字符串

    private static String doPost(String postUrl, JSONObject jsonObj) throws ClientProtocolException, IOException {
CloseableHttpClient httpclient = HttpClients.createDefault();
// HttpClient httpclient = new DefaultHttpClient();
HttpPost post = new HttpPost(postUrl);
post.setHeader("Content-Type", "application/json");
post.addHeader("Authorization", "Basic YWRtaW46");
String str = null;
StringEntity s = new StringEntity(jsonObj.toString(), "utf-8");
s.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
post.setEntity(s);
CloseableHttpResponse response = httpclient.execute(post);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instreams = entity.getContent();
str = convertStreamToString(instreams);
post.abort();
}
System.out.println(str);
return str;
}

响应信息处理类:

    private static String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try {
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb.toString();
}

2017/3/1: 后因频繁调用次数过多, 加入HttpClient连接池

package com.iwhere.util;

import java.io.IOException;
import java.io.InterruptedIOException;
import java.net.UnknownHostException; import javax.net.ssl.SSLException;
import javax.net.ssl.SSLHandshakeException; import org.apache.http.HttpEntityEnclosingRequest;
import org.apache.http.HttpRequest;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.HttpRequestRetryHandler;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.LayeredConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.protocol.HttpContext; public class HttpClientPool { public static CloseableHttpClient getHttpClient() {
ConnectionSocketFactory plainsf = PlainConnectionSocketFactory.getSocketFactory();
LayeredConnectionSocketFactory sslsf = SSLConnectionSocketFactory.getSocketFactory();
Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", plainsf)
.register("https", sslsf)
.build();
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(registry);
// 将最大连接数增加到200
cm.setMaxTotal();
// 将每个路由基础的连接增加到20
cm.setDefaultMaxPerRoute();
// 将目标主机的最大连接数增加到50
// HttpHost localhost = new HttpHost("http://dev.iwhere.com",8010);
// cm.setMaxPerRoute(new HttpRoute(localhost), 70); //请求重试处理
HttpRequestRetryHandler httpRequestRetryHandler = new HttpRequestRetryHandler() {
public boolean retryRequest(IOException exception,int executionCount, HttpContext context) {
if (executionCount >= ) {// 如果已经重试了5次,就放弃
return false;
}
if (exception instanceof NoHttpResponseException) {// 如果服务器丢掉了连接,那么就重试
return true;
}
if (exception instanceof SSLHandshakeException) {// 不要重试SSL握手异常
return false;
}
if (exception instanceof InterruptedIOException) {// 超时
return false;
}
if (exception instanceof UnknownHostException) {// 目标服务器不可达
return false;
}
if (exception instanceof ConnectTimeoutException) {// 连接被拒绝
return false;
}
if (exception instanceof SSLException) {// ssl握手异常
return false;
} HttpClientContext clientContext = HttpClientContext.adapt(context);
HttpRequest request = clientContext.getRequest();
// 如果请求是幂等的,就再次尝试
if (!(request instanceof HttpEntityEnclosingRequest)) {
return true;
}
return false;
}
}; return HttpClients.custom().setConnectionManager(cm).setRetryHandler(httpRequestRetryHandler).build();
} }

使用httpClient处理get请求或post请求的更多相关文章

  1. HttpClient发送Post请求,get请求

    // 创建默认的httpclient实例 CloseableHttpClient httpclient = getHttpClient(); CloseableHttpResponse respons ...

  2. httpClient 中的post或者get请求

    httpClient相对于java自带的请求功能更加强大,下面就以例子的形式给出: //HttpClient Get请求 private static void register() { try { ...

  3. JAVA发送HttpClient请求及接收请求结果

    1.写一个HttpRequestUtils工具类,包括post请求和get请求 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2 ...

  4. httpclient实现的get请求及post请求

    导出mven依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId& ...

  5. JAVA发送HttpClient请求及接收请求结果过程

    1.写一个HttpRequestUtils工具类,包括post请求和get请求 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...

  6. 封装HttpClient进行http请求与https请求

    一.https忽略证书 /** * 用于进行Https请求的HttpClient * * @author joey * */ public class SSLClient { public stati ...

  7. HttpClient之用CloseableHttpClient发送post请求

    使用HttpClient发送请求的一般步骤(1) 创建HttpClient对象.(2)创建请求方法的实例,并指定请求URL.如果需要发送GET请求,创建HttpGet对象:如果需要发送POST请求,创 ...

  8. HttpClient之Get请求和Post请求示例

    HttpClient之Get请求和Post请求示例 博客分类: Java综合   HttpClient的支持在HTTP/1.1规范中定义的所有的HTTP方法:GET, HEAD, POST, PUT, ...

  9. WebApi系列~基于单请求封装多请求的设计

    回到目录 怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能 ...

  10. webapi基于单请求封装多请求的设计【转】

    怎么说,单请求封装多请求,这句话确实有点绕了,但还是要看清楚,想明白这到底是怎么一回事,单请求即一次请求(get,post,put,delete),封闭多请求,即在客户端发送的一个请求中可能包含多个子 ...

随机推荐

  1. C++互斥器:Mutex

    互斥器的功能是,使多个线程和谐工作.同一时间内,只能有一个线程得到互斥对象,并获得资源操作权限,那么如果同一时间其他线程也想去操作资源,此时就会因为Mutex未处于激发状态,而无奈的等待…这时候,线程 ...

  2. netcore配置文件与发布

    这段时间好几次想写博客,但是却发现无法编辑,至今都不行 CuteEditor TinyMCE(推荐) 以上两种都不行,只好更改默认编辑器为textbox. 一直以为被封了还是怎么滴,原来是突然不支持c ...

  3. 用 vs 2017创建 windows 服务

    转载自:http://www.cnblogs.com/xujie/p/5695673.html 1.新建windows服务项目,我这里选择的是Framework4.0,没有选择高版本是为了防止在服务在 ...

  4. 登录状态保持Session/Cookie

    登录成功: 1.Session保存User对象. 2.Cookie保存唯一值UserID(或者usercode)和加密Sign(生成规则自己定义,MD5用户名,用户ID,私有串等),并设置过期时间. ...

  5. HTTP服务介绍

    摘自 https://mp.weixin.qq.com/s?__biz=MzI4NDM5NzE4Ng==&mid=2247484093&idx=1&sn=3d87e9772ff ...

  6. Mysql -Linux系统下安装指南

    博客参考:  https://www.cnblogs.com/pyyu/p/9467289.html 1. Mysql安装 .首先在 RHEL/CentOS 和 Fedora 操作系统中添加 Mari ...

  7. 898. Bitwise ORs of Subarrays

    We have an array A of non-negative integers. For every (contiguous) subarray B = [A[i], A[i+1], ..., ...

  8. Python 面向对象编程的一些特征 及 单例模式的实现, 父类方法的调用(python2/python3)

    一.面向对象编程几个特征(封装, 继承,多态) 1.封装:类里面封装函数和变量, 在将类进行实例化成实例对象时进行传参, 从而生成不同的实例对象,增加代码的复用. 2.继承:子类可以继承父类的方法和属 ...

  9. Spring Boot快速搭建Web工程

    先想一下,正常我们想要创建一个web服务,首先需要下载tomcat,创建web工程,配置各种web.xml,引入spring的配置,各种配置文件一顿倒腾.....下载有了spring boot,你创建 ...

  10. 在.net core Mvc中使用Options和IOptionsSnapshot

    1.Startup.cs 下代码 using System; using System.Collections.Generic; using System.Linq; using System.Thr ...