zoukankan      html  css  js  c++  java
  • HttpClient Get请求实例

    Httpclient是我们平时中用的比较多的,但是一般用的时候都是去网上百度一下,把demo直接拿过来改一下用就行了,接下来我们来看他的一些具体的用法。Apache HttpComponents™项目负责创建和维护一个专注于HTTP和相关协议的低级Java组件工具集。该项目在Apache软件基金会下运行,并且是更大的开发人员和用户社区的一部分。

    很多情况下我们都会用到HttpClient来发送Get请求,下面我来看下具体的代码:

    CloseableHttpClient httpclient = HttpClients.createDefalt();
    HttpGet httpget = new HttpGet("http://www.baidu.com");
    
    RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(50000).setSocketTimeout(50000)
    				.setConnectionRequestTimeout(3000).build();
    httpget.setConfig(requestConfig);
    CloseableHttpResponse response = httpClient.execute(httpget);
    if (response != null) {
    	HttpEntity entity = response.getEntity(); // 获取返回实体
    	if (entity != null) {
    	    EntityUtils.toString(entity)
    	}
    }

    这是CloseableHttpClient的源码可知:

    这个类继承自HttpClient,我们继续分析HttpClient类,可以看到他是顶级的接口类。

    HttpClients的一些工具类,我们来看:

    继续看build是个什么东西:

    public CloseableHttpClient build() {
            // Create main request executor
            // We copy the instance fields to avoid changing them, and rename to avoid accidental use of the wrong version
            PublicSuffixMatcher publicSuffixMatcherCopy = this.publicSuffixMatcher;
            if (publicSuffixMatcherCopy == null) {
                publicSuffixMatcherCopy = PublicSuffixMatcherLoader.getDefault();
            }
    
            HttpRequestExecutor requestExecCopy = this.requestExec;
            if (requestExecCopy == null) {
                requestExecCopy = new HttpRequestExecutor();
            }
            HttpClientConnectionManager connManagerCopy = this.connManager;
            if (connManagerCopy == null) {
                LayeredConnectionSocketFactory sslSocketFactoryCopy = this.sslSocketFactory;
                if (sslSocketFactoryCopy == null) {
                    final String[] supportedProtocols = systemProperties ? split(
                            System.getProperty("https.protocols")) : null;
                    final String[] supportedCipherSuites = systemProperties ? split(
                            System.getProperty("https.cipherSuites")) : null;
                    HostnameVerifier hostnameVerifierCopy = this.hostnameVerifier;
                    if (hostnameVerifierCopy == null) {
                        hostnameVerifierCopy = new DefaultHostnameVerifier(publicSuffixMatcherCopy);
                    }
                    if (sslContext != null) {
                        sslSocketFactoryCopy = new SSLConnectionSocketFactory(
                                sslContext, supportedProtocols, supportedCipherSuites, hostnameVerifierCopy);
                    } else {
                        if (systemProperties) {
                            sslSocketFactoryCopy = new SSLConnectionSocketFactory(
                                    (SSLSocketFactory) SSLSocketFactory.getDefault(),
                                    supportedProtocols, supportedCipherSuites, hostnameVerifierCopy);
                        } else {
                            sslSocketFactoryCopy = new SSLConnectionSocketFactory(
                                    SSLContexts.createDefault(),
                                    hostnameVerifierCopy);
                        }
                    }
                }
                @SuppressWarnings("resource")
                final PoolingHttpClientConnectionManager poolingmgr = new PoolingHttpClientConnectionManager(
                        RegistryBuilder.<ConnectionSocketFactory>create()
                            .register("http", PlainConnectionSocketFactory.getSocketFactory())
                            .register("https", sslSocketFactoryCopy)
                            .build(),
                        null,
                        null,
                        dnsResolver,
                        connTimeToLive,
                        connTimeToLiveTimeUnit != null ? connTimeToLiveTimeUnit : TimeUnit.MILLISECONDS);
                if (defaultSocketConfig != null) {
                    poolingmgr.setDefaultSocketConfig(defaultSocketConfig);
                }
                if (defaultConnectionConfig != null) {
                    poolingmgr.setDefaultConnectionConfig(defaultConnectionConfig);
                }
                if (systemProperties) {
                    String s = System.getProperty("http.keepAlive", "true");
                    if ("true".equalsIgnoreCase(s)) {
                        s = System.getProperty("http.maxConnections", "5");
                        final int max = Integer.parseInt(s);
                        poolingmgr.setDefaultMaxPerRoute(max);
                        poolingmgr.setMaxTotal(2 * max);
                    }
                }
                if (maxConnTotal > 0) {
                    poolingmgr.setMaxTotal(maxConnTotal);
                }
                if (maxConnPerRoute > 0) {
                    poolingmgr.setDefaultMaxPerRoute(maxConnPerRoute);
                }
                connManagerCopy = poolingmgr;
            }
            ConnectionReuseStrategy reuseStrategyCopy = this.reuseStrategy;
            if (reuseStrategyCopy == null) {
                if (systemProperties) {
                    final String s = System.getProperty("http.keepAlive", "true");
                    if ("true".equalsIgnoreCase(s)) {
                        reuseStrategyCopy = DefaultClientConnectionReuseStrategy.INSTANCE;
                    } else {
                        reuseStrategyCopy = NoConnectionReuseStrategy.INSTANCE;
                    }
                } else {
                    reuseStrategyCopy = DefaultClientConnectionReuseStrategy.INSTANCE;
                }
            }
            ConnectionKeepAliveStrategy keepAliveStrategyCopy = this.keepAliveStrategy;
            if (keepAliveStrategyCopy == null) {
                keepAliveStrategyCopy = DefaultConnectionKeepAliveStrategy.INSTANCE;
            }
            AuthenticationStrategy targetAuthStrategyCopy = this.targetAuthStrategy;
            if (targetAuthStrategyCopy == null) {
                targetAuthStrategyCopy = TargetAuthenticationStrategy.INSTANCE;
            }
            AuthenticationStrategy proxyAuthStrategyCopy = this.proxyAuthStrategy;
            if (proxyAuthStrategyCopy == null) {
                proxyAuthStrategyCopy = ProxyAuthenticationStrategy.INSTANCE;
            }
            UserTokenHandler userTokenHandlerCopy = this.userTokenHandler;
            if (userTokenHandlerCopy == null) {
                if (!connectionStateDisabled) {
                    userTokenHandlerCopy = DefaultUserTokenHandler.INSTANCE;
                } else {
                    userTokenHandlerCopy = NoopUserTokenHandler.INSTANCE;
                }
            }
    
            String userAgentCopy = this.userAgent;
            if (userAgentCopy == null) {
                if (systemProperties) {
                    userAgentCopy = System.getProperty("http.agent");
                }
                if (userAgentCopy == null) {
                    userAgentCopy = VersionInfo.getUserAgent("Apache-HttpClient",
                            "org.apache.http.client", getClass());
                }
            }
    
            ClientExecChain execChain = createMainExec(
                    requestExecCopy,
                    connManagerCopy,
                    reuseStrategyCopy,
                    keepAliveStrategyCopy,
                    new ImmutableHttpProcessor(new RequestTargetHost(), new RequestUserAgent(userAgentCopy)),
                    targetAuthStrategyCopy,
                    proxyAuthStrategyCopy,
                    userTokenHandlerCopy);
    
            execChain = decorateMainExec(execChain);
    
            HttpProcessor httpprocessorCopy = this.httpprocessor;
            if (httpprocessorCopy == null) {
    
                final HttpProcessorBuilder b = HttpProcessorBuilder.create();
                if (requestFirst != null) {
                    for (final HttpRequestInterceptor i: requestFirst) {
                        b.addFirst(i);
                    }
                }
                if (responseFirst != null) {
                    for (final HttpResponseInterceptor i: responseFirst) {
                        b.addFirst(i);
                    }
                }
                b.addAll(
                        new RequestDefaultHeaders(defaultHeaders),
                        new RequestContent(),
                        new RequestTargetHost(),
                        new RequestClientConnControl(),
                        new RequestUserAgent(userAgentCopy),
                        new RequestExpectContinue());
                if (!cookieManagementDisabled) {
                    b.add(new RequestAddCookies());
                }
                if (!contentCompressionDisabled) {
                    if (contentDecoderMap != null) {
                        final List<String> encodings = new ArrayList<String>(contentDecoderMap.keySet());
                        Collections.sort(encodings);
                        b.add(new RequestAcceptEncoding(encodings));
                    } else {
                        b.add(new RequestAcceptEncoding());
                    }
                }
                if (!authCachingDisabled) {
                    b.add(new RequestAuthCache());
                }
                if (!cookieManagementDisabled) {
                    b.add(new ResponseProcessCookies());
                }
                if (!contentCompressionDisabled) {
                    if (contentDecoderMap != null) {
                        final RegistryBuilder<InputStreamFactory> b2 = RegistryBuilder.create();
                        for (final Map.Entry<String, InputStreamFactory> entry: contentDecoderMap.entrySet()) {
                            b2.register(entry.getKey(), entry.getValue());
                        }
                        b.add(new ResponseContentEncoding(b2.build()));
                    } else {
                        b.add(new ResponseContentEncoding());
                    }
                }
                if (requestLast != null) {
                    for (final HttpRequestInterceptor i: requestLast) {
                        b.addLast(i);
                    }
                }
                if (responseLast != null) {
                    for (final HttpResponseInterceptor i: responseLast) {
                        b.addLast(i);
                    }
                }
                httpprocessorCopy = b.build();
            }
            execChain = new ProtocolExec(execChain, httpprocessorCopy);
    
            execChain = decorateProtocolExec(execChain);
    
            // Add request retry executor, if not disabled
            if (!automaticRetriesDisabled) {
                HttpRequestRetryHandler retryHandlerCopy = this.retryHandler;
                if (retryHandlerCopy == null) {
                    retryHandlerCopy = DefaultHttpRequestRetryHandler.INSTANCE;
                }
                execChain = new RetryExec(execChain, retryHandlerCopy);
            }
    
            HttpRoutePlanner routePlannerCopy = this.routePlanner;
            if (routePlannerCopy == null) {
                SchemePortResolver schemePortResolverCopy = this.schemePortResolver;
                if (schemePortResolverCopy == null) {
                    schemePortResolverCopy = DefaultSchemePortResolver.INSTANCE;
                }
                if (proxy != null) {
                    routePlannerCopy = new DefaultProxyRoutePlanner(proxy, schemePortResolverCopy);
                } else if (systemProperties) {
                    routePlannerCopy = new SystemDefaultRoutePlanner(
                            schemePortResolverCopy, ProxySelector.getDefault());
                } else {
                    routePlannerCopy = new DefaultRoutePlanner(schemePortResolverCopy);
                }
            }
    
            // Optionally, add service unavailable retry executor
            final ServiceUnavailableRetryStrategy serviceUnavailStrategyCopy = this.serviceUnavailStrategy;
            if (serviceUnavailStrategyCopy != null) {
                execChain = new ServiceUnavailableRetryExec(execChain, serviceUnavailStrategyCopy);
            }
    
            // Add redirect executor, if not disabled
            if (!redirectHandlingDisabled) {
                RedirectStrategy redirectStrategyCopy = this.redirectStrategy;
                if (redirectStrategyCopy == null) {
                    redirectStrategyCopy = DefaultRedirectStrategy.INSTANCE;
                }
                execChain = new RedirectExec(execChain, routePlannerCopy, redirectStrategyCopy);
            }
    
            // Optionally, add connection back-off executor
            if (this.backoffManager != null && this.connectionBackoffStrategy != null) {
                execChain = new BackoffStrategyExec(execChain, this.connectionBackoffStrategy, this.backoffManager);
            }
    
            Lookup<AuthSchemeProvider> authSchemeRegistryCopy = this.authSchemeRegistry;
            if (authSchemeRegistryCopy == null) {
                authSchemeRegistryCopy = RegistryBuilder.<AuthSchemeProvider>create()
                    .register(AuthSchemes.BASIC, new BasicSchemeFactory())
                    .register(AuthSchemes.DIGEST, new DigestSchemeFactory())
                    .register(AuthSchemes.NTLM, new NTLMSchemeFactory())
                    .register(AuthSchemes.SPNEGO, new SPNegoSchemeFactory())
                    .register(AuthSchemes.KERBEROS, new KerberosSchemeFactory())
                    .build();
            }
            Lookup<CookieSpecProvider> cookieSpecRegistryCopy = this.cookieSpecRegistry;
            if (cookieSpecRegistryCopy == null) {
                cookieSpecRegistryCopy = CookieSpecRegistries.createDefault(publicSuffixMatcherCopy);
            }
    
            CookieStore defaultCookieStore = this.cookieStore;
            if (defaultCookieStore == null) {
                defaultCookieStore = new BasicCookieStore();
            }
    
            CredentialsProvider defaultCredentialsProvider = this.credentialsProvider;
            if (defaultCredentialsProvider == null) {
                if (systemProperties) {
                    defaultCredentialsProvider = new SystemDefaultCredentialsProvider();
                } else {
                    defaultCredentialsProvider = new BasicCredentialsProvider();
                }
            }
    
            List<Closeable> closeablesCopy = closeables != null ? new ArrayList<Closeable>(closeables) : null;
            if (!this.connManagerShared) {
                if (closeablesCopy == null) {
                    closeablesCopy = new ArrayList<Closeable>(1);
                }
                final HttpClientConnectionManager cm = connManagerCopy;
    
                if (evictExpiredConnections || evictIdleConnections) {
                    final IdleConnectionEvictor connectionEvictor = new IdleConnectionEvictor(cm,
                            maxIdleTime > 0 ? maxIdleTime : 10, maxIdleTimeUnit != null ? maxIdleTimeUnit : TimeUnit.SECONDS);
                    closeablesCopy.add(new Closeable() {
    
                        @Override
                        public void close() throws IOException {
                            connectionEvictor.shutdown();
                        }
    
                    });
                    connectionEvictor.start();
                }
                closeablesCopy.add(new Closeable() {
    
                    @Override
                    public void close() throws IOException {
                        cm.shutdown();
                    }
    
                });
            }
    
            return new InternalHttpClient(
                    execChain,
                    connManagerCopy,
                    routePlannerCopy,
                    cookieSpecRegistryCopy,
                    authSchemeRegistryCopy,
                    defaultCookieStore,
                    defaultCredentialsProvider,
                    defaultRequestConfig != null ? defaultRequestConfig : RequestConfig.DEFAULT,
                    closeablesCopy);
        }

    我们可以看到他这个的实现是非常复杂的,我们来看execute方法:

    他是一个抽象类,具体的实现在子类:

    @Override
        protected final CloseableHttpResponse doExecute(final HttpHost target, final HttpRequest request,
                                          final HttpContext context)
            throws IOException, ClientProtocolException {
    
            Args.notNull(request, "HTTP request");
            // a null target may be acceptable, this depends on the route planner
            // a null context is acceptable, default context created below
    
            HttpContext execContext = null;
            RequestDirector director = null;
            HttpRoutePlanner routePlanner = null;
            ConnectionBackoffStrategy connectionBackoffStrategy = null;
            BackoffManager backoffManager = null;
    
            // Initialize the request execution context making copies of
            // all shared objects that are potentially threading unsafe.
            synchronized (this) {
    
                final HttpContext defaultContext = createHttpContext();
                if (context == null) {
                    execContext = defaultContext;
                } else {
                    execContext = new DefaultedHttpContext(context, defaultContext);
                }
                final HttpParams params = determineParams(request);
                final RequestConfig config = HttpClientParamConfig.getRequestConfig(params);
                execContext.setAttribute(ClientContext.REQUEST_CONFIG, config);
    
                // Create a director for this request
                director = createClientRequestDirector(
                        getRequestExecutor(),
                        getConnectionManager(),
                        getConnectionReuseStrategy(),
                        getConnectionKeepAliveStrategy(),
                        getRoutePlanner(),
                        getProtocolProcessor(),
                        getHttpRequestRetryHandler(),
                        getRedirectStrategy(),
                        getTargetAuthenticationStrategy(),
                        getProxyAuthenticationStrategy(),
                        getUserTokenHandler(),
                        params);
                routePlanner = getRoutePlanner();
                connectionBackoffStrategy = getConnectionBackoffStrategy();
                backoffManager = getBackoffManager();
            }
    
            try {
                if (connectionBackoffStrategy != null && backoffManager != null) {
                    final HttpHost targetForRoute = (target != null) ? target
                            : (HttpHost) determineParams(request).getParameter(
                                    ClientPNames.DEFAULT_HOST);
                    final HttpRoute route = routePlanner.determineRoute(targetForRoute, request, execContext);
    
                    final CloseableHttpResponse out;
                    try {
                        out = CloseableHttpResponseProxy.newProxy(
                                director.execute(target, request, execContext));
                    } catch (final RuntimeException re) {
                        if (connectionBackoffStrategy.shouldBackoff(re)) {
                            backoffManager.backOff(route);
                        }
                        throw re;
                    } catch (final Exception e) {
                        if (connectionBackoffStrategy.shouldBackoff(e)) {
                            backoffManager.backOff(route);
                        }
                        if (e instanceof HttpException) {
                            throw (HttpException)e;
                        }
                        if (e instanceof IOException) {
                            throw (IOException)e;
                        }
                        throw new UndeclaredThrowableException(e);
                    }
                    if (connectionBackoffStrategy.shouldBackoff(out)) {
                        backoffManager.backOff(route);
                    } else {
                        backoffManager.probe(route);
                    }
                    return out;
                } else {
                    return CloseableHttpResponseProxy.newProxy(
                            director.execute(target, request, execContext));
                }
            } catch(final HttpException httpException) {
                throw new ClientProtocolException(httpException);
            }
        }

    这个是他里边的一个实现,可以看出来,也是非常复杂的。HttpClient Get的请求大概就这么多,想深入的同学可以去仔细研究源码。

    有问题可以在下面评论,技术问题可以私聊我。

  • 相关阅读:
    开源云平台离普通用户还有多远?
    你的云桌面和阿里的云主机有什么区别?
    容器和虚拟机谁会是未来云计算的方向?
    白话为什么需要虚拟机和云计算有什么关系
    OpenStack是什么?
    Kubernetes是什么?
    第二夜:万圣节,讲一个关于程序员的故事
    万圣节,讲一个关于程序员的故事
    云计算社区新增两枚 .group 社群专属域名
    正式激活 .group 域名:云原生.社群
  • 原文地址:https://www.cnblogs.com/c1024/p/11012011.html
Copyright © 2011-2022 走看看