• 使用httpClient处理get请求或post请求


    另外一个版本: 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 + "
    ");
                }
            } 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(300);
            // 将每个路由基础的连接增加到20
            cm.setDefaultMaxPerRoute(20);
            // 将目标主机的最大连接数增加到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) {// 如果已经重试了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();
        }
         
    }
  • 相关阅读:
    从Python编程小白到大神?你可能还差这几步!
    网红游戏主播靠几行代码轻松“吃鸡”年赚百万!竟然是依靠Python
    爬虫凶猛:爬支付宝、爬微信、窃取数据/编程实战(2):爬虫架构
    轻松入门学网络爬虫编程实战(1):音乐歌单篇
    Centos System Info
    iOS xcodebuild 打包app
    Xcode部分插件无法使用识别的问题
    ios get airplay name
    Re-enable Alcatraz on Xcode 6.3.2 or newer
    Apple LLVM 6.0 Warning: profile data may be out of date
  • 原文地址:https://www.cnblogs.com/wenbronk/p/6482706.html
Copyright © 2020-2023  润新知