美文网首页
Httpclient(一)

Httpclient(一)

作者: 寂静的春天1988 | 来源:发表于2020-08-24 15:27 被阅读0次

    项目里有两个pom

            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>commons-httpclient</artifactId>
                <version>3.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.4.1</version><!--$NO-MVN-MAN-VER$ -->
            </dependency>
    

    上网查了一下
    Commons HttpClient项目现已结束,不再开发。它已被其HttpClient和HttpCore模块中的Apache HttpComponents项目所取代,它们提供更好的性能和更大的灵活性。
    从2011年开始,org.apache.commons.httpclient就不再开发。这就是说,它已经落伍了。

    下面的代码都是借着谷歌翻译,然后从官网看,copy过来的

    快速开始

        CloseableHttpClient httpclient = HttpClients.createDefault();
            HttpGet httpGet = new HttpGet("http://targethost/homepage");
            CloseableHttpResponse response1 = httpclient.execute(httpGet);
            try {
                System.out.println(response1.getStatusLine());
                HttpEntity entity1 = response1.getEntity();
                // do something useful with the response body
                // and ensure it is fully consumed
                EntityUtils.consume(entity1);
            } finally {
                response1.close();
            }
    
            HttpPost httpPost = new HttpPost("http://targethost/login");
            List <BasicNameValuePair> nvps = new ArrayList <BasicNameValuePair>();
            nvps.add(new BasicNameValuePair("username", "vip"));
            nvps.add(new BasicNameValuePair("password", "secret"));
            httpPost.setEntity(new UrlEncodedFormEntity(nvps));
            CloseableHttpResponse response2 = httpclient.execute(httpPost);
    
            try {
                System.out.println(response2.getStatusLine());
                HttpEntity entity2 = response2.getEntity();
                // do something useful with the response body
                // and ensure it is fully consumed
                EntityUtils.consume(entity2);
            } finally {
                response2.close();
            }
    

    copy的官网示例:List <NameValuePair> 这行根本不能编译过,坑爹。改成了List <BasicNameValuePair>

    处理响应

    CloseableHttpClient httpclient = HttpClients.createDefault();
            try {
                HttpGet httpget = new HttpGet("http://httpbin.org/");
    
                System.out.println("Executing request " + httpget.getRequestLine());
    
                // Create a custom response handler
                ResponseHandler<String> responseHandler = new ResponseHandler<String>() {
    
                    @Override
                    public String handleResponse(
                            final HttpResponse response) throws ClientProtocolException, IOException {
                        int status = response.getStatusLine().getStatusCode();
                        if (status >= 200 && status < 300) {
                            HttpEntity entity = response.getEntity();
                            return entity != null ? EntityUtils.toString(entity) : null;
                        } else {
                            throw new ClientProtocolException("Unexpected response status: " + status);
                        }
                    }
    
                };
                String responseBody = httpclient.execute(httpget, responseHandler);
                System.out.println("----------------------------------------");
                System.out.println(responseBody);
            } finally {
                httpclient.close();
            }
    

    手动关闭连接

    CloseableHttpClient httpclient = HttpClients.createDefault();
            try {
                HttpGet httpget = new HttpGet("http://httpbin.org/get");
    
                System.out.println("Executing request " + httpget.getRequestLine());
                CloseableHttpResponse response = httpclient.execute(httpget);
                try {
                    System.out.println("----------------------------------------");
                    System.out.println(response.getStatusLine());
    
                    // 获得响应体对象
                    HttpEntity entity = response.getEntity();
    
                    if (entity != null) {
                        // 将响应内容转换成输入流对象
                        InputStream inStream = entity.getContent();
                        try {
                            inStream.read();
                            // do something useful with the response
                        } catch (IOException ex) {
                            // 发生IO流异常,会自动关闭连接
                            throw ex;
                        } finally {
                            // 关闭输入流
                            inStream.close();
                        }
                    }
                } finally {
                    response.close();
                }
            } finally {
                httpclient.close();
            }
    

    httpclient配置

    
    
            // Use custom message parser / writer to customize the way HTTP
            // messages are parsed from and written out to the data stream.
            HttpMessageParserFactory<HttpResponse> responseParserFactory = new DefaultHttpResponseParserFactory() {
    
                @Override
                public HttpMessageParser<HttpResponse> create(
                    SessionInputBuffer buffer, MessageConstraints constraints) {
                    LineParser lineParser = new BasicLineParser() {
    
                        @Override
                        public Header parseHeader(final CharArrayBuffer buffer) {
                               return super.parseHeader(buffer);
                        }
    
                    };
                    return new DefaultHttpResponseParser(
                        buffer, lineParser, DefaultHttpResponseFactory.INSTANCE, constraints) {
    
                        @Override
                        protected boolean reject(final CharArrayBuffer line, int count) {
                            // try to ignore all garbage preceding a status line infinitely
                            return false;
                        }
    
                    };
                }
    
            };
            HttpMessageWriterFactory<HttpRequest> requestWriterFactory = new DefaultHttpRequestWriterFactory();
    
            // Use a custom connection factory to customize the process of
            // initialization of outgoing HTTP connections. Beside standard connection
            // configuration parameters HTTP connection factory can define message
            // parser / writer routines to be employed by individual connections.
            HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connFactory = new ManagedHttpClientConnectionFactory(
                    requestWriterFactory, responseParserFactory);
    
            // Client HTTP connection objects when fully initialized can be bound to
            // an arbitrary network socket. The process of network socket initialization,
            // its connection to a remote address and binding to a local one is controlled
            // by a connection socket factory.
    
            // SSL context for secure connections can be created either based on
            // system or application specific properties.
            SSLContext sslcontext = SSLContexts.createSystemDefault();
    
            // Create a registry of custom connection socket factories for supported
            // protocol schemes.
            Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create()
                .register("http", PlainConnectionSocketFactory.INSTANCE)
                .register("https", new SSLConnectionSocketFactory(sslcontext))
                .build();
    
            // Use custom DNS resolver to override the system DNS resolution.
            DnsResolver dnsResolver = new SystemDefaultDnsResolver() {
    
                @Override
                public InetAddress[] resolve(final String host) throws UnknownHostException {
                    if (host.equalsIgnoreCase("myhost")) {
                        return new InetAddress[] { InetAddress.getByAddress(new byte[] {127, 0, 0, 1}) };
                    } else {
                        return super.resolve(host);
                    }
                }
    
            };
    
            // Create a connection manager with custom configuration.
            PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(
                    socketFactoryRegistry, connFactory, dnsResolver);
    
            // Create socket configuration
            SocketConfig socketConfig = SocketConfig.custom()
                .setTcpNoDelay(true)
                .build();
            // Configure the connection manager to use socket configuration either
            // by default or for a specific host.
            connManager.setDefaultSocketConfig(socketConfig);
            connManager.setSocketConfig(new HttpHost("somehost", 80), socketConfig);
            // Validate connections after 1 sec of inactivity
            connManager.setValidateAfterInactivity(1000);
    
            // Create message constraints
            MessageConstraints messageConstraints = MessageConstraints.custom()
                .setMaxHeaderCount(200)
                .setMaxLineLength(2000)
                .build();
            // Create connection configuration
            ConnectionConfig connectionConfig = ConnectionConfig.custom()
                .setMalformedInputAction(CodingErrorAction.IGNORE)
                .setUnmappableInputAction(CodingErrorAction.IGNORE)
                .setCharset(Consts.UTF_8)
                .setMessageConstraints(messageConstraints)
                .build();
            // Configure the connection manager to use connection configuration either
            // by default or for a specific host.
            connManager.setDefaultConnectionConfig(connectionConfig);
            connManager.setConnectionConfig(new HttpHost("somehost", 80), ConnectionConfig.DEFAULT);
    
            // Configure total max or per route limits for persistent connections
            // that can be kept in the pool or leased by the connection manager.
            connManager.setMaxTotal(100);
            connManager.setDefaultMaxPerRoute(10);
            connManager.setMaxPerRoute(new HttpRoute(new HttpHost("somehost", 80)), 20);
    
            // Use custom cookie store if necessary.
            CookieStore cookieStore = new BasicCookieStore();
            // Use custom credentials provider if necessary.
            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            // Create global request configuration
            RequestConfig defaultRequestConfig = RequestConfig.custom()
                .setCookieSpec(CookieSpecs.DEFAULT)
                .setExpectContinueEnabled(true)
                .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))
                .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC))
                .build();
    
            // Create an HttpClient with the given custom dependencies and configuration.
            CloseableHttpClient httpclient = HttpClients.custom()
                .setConnectionManager(connManager)
                .setDefaultCookieStore(cookieStore)
                .setDefaultCredentialsProvider(credentialsProvider)
                .setProxy(new HttpHost("myproxy", 8080))
                .setDefaultRequestConfig(defaultRequestConfig)
                .build();
    
            try {
                HttpGet httpget = new HttpGet("http://httpbin.org/get");
                RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig)
                    .setSocketTimeout(5000)// 请求获取数据的超时时间,单位毫秒。 如果访问一个接口,多少时间内无法返回数据,就直接放弃此次调用
                    .setConnectTimeout(5000)// 设置连接超时时间
                    .setConnectionRequestTimeout(5000)// 设置从connect Manager获取Connection 超时时间
                    .setProxy(new HttpHost("myotherproxy", 8080))
                    .build();
                httpget.setConfig(requestConfig);
    
                // Execution context can be customized locally.
                HttpClientContext context = HttpClientContext.create();
                // Contextual attributes set the local context level will take
                // precedence over those set at the client level.
                context.setCookieStore(cookieStore);
                context.setCredentialsProvider(credentialsProvider);
    
                System.out.println("executing request " + httpget.getURI());
                CloseableHttpResponse response = httpclient.execute(httpget, context);
                try {
                    System.out.println("----------------------------------------");
                    System.out.println(response.getStatusLine());
                    System.out.println(EntityUtils.toString(response.getEntity()));
                    System.out.println("----------------------------------------");
    
                    // Once the request has been executed the local context can
                    // be used to examine updated state and various objects affected
                    // by the request execution.
    
                    // Last executed request
                    context.getRequest();
                    // Execution route
                    context.getHttpRoute();
                    // Target auth state
                    context.getTargetAuthState();
                    // Proxy auth state
                    context.getProxyAuthState();
                    // Cookie origin
                    context.getCookieOrigin();
                    // Cookie spec used
                    context.getCookieSpec();
                    // User security token
                    context.getUserToken();
    
                } finally {
                    response.close();
                }
            } finally {
                httpclient.close();
            }
        
    

    配置参数基本上都没看懂,只看懂了设置请求超时时间那几行。

    中止方法:此示例演示如何在正常完成之前中止HTTP请求。

    
             CloseableHttpClient httpclient = HttpClients.createDefault();
                try {
                    HttpGet httpget = new HttpGet("http://httpbin.org/get");
    
                    System.out.println("Executing request " + httpget.getURI());
                    CloseableHttpResponse response = httpclient.execute(httpget);
                    try {
                        System.out.println("----------------------------------------");
                        System.out.println(response.getStatusLine());
                        // Do not feel like reading the response body
                        // Call abort on the request object
                        httpget.abort();
                    } finally {
                        response.close();
                    }
                } finally {
                    httpclient.close();
                }
    

    客户端认证:本示例使用HttpClient对需要用户身份验证的目标站点执行HTTP请求。

    
            CredentialsProvider credsProvider = new BasicCredentialsProvider();
            credsProvider.setCredentials(
                    new AuthScope("httpbin.org", 80),
                    new UsernamePasswordCredentials("user", "passwd"));
            CloseableHttpClient httpclient = HttpClients.custom()
                    .setDefaultCredentialsProvider(credsProvider)
                    .build();
            try {
                HttpGet httpget = new HttpGet("http://httpbin.org/basic-auth/user/passwd");
    
                System.out.println("Executing request " + httpget.getRequestLine());
                CloseableHttpResponse response = httpclient.execute(httpget);
                try {
                    System.out.println("----------------------------------------");
                    System.out.println(response.getStatusLine());
                    System.out.println(EntityUtils.toString(response.getEntity()));
                } finally {
                    response.close();
                }
            } finally {
                httpclient.close();
            }
        
    

    额,这里百度了一下这个是干嘛用的,大概就是http提供基本的安全校验的功能。不过现在大家都用安全框架了,实际中我也没碰到过这种,这里就不研究了。

    通过代理发送HTTP请求。

    
             CloseableHttpClient httpclient = HttpClients.createDefault();
                try {
                    //设置要访问的HttpHost,即是目标站点的HttpHost
                    HttpHost target = new HttpHost("httpbin.org", 443, "https");
                    // 设置代理服务器的ip和地址
                    HttpHost proxy = new HttpHost("127.0.0.1", 8080, "http");
    
                    RequestConfig config = RequestConfig.custom()
                            .setProxy(proxy)
                            .build();
                    HttpGet request = new HttpGet("/");
                    request.setConfig(config);
    
                    System.out.println("Executing request " + request.getRequestLine() + " to " + target + " via " + proxy);
    
                    CloseableHttpResponse response = httpclient.execute(target, request);
                    try {
                        System.out.println("----------------------------------------");
                        System.out.println(response.getStatusLine());
                        System.out.println(EntityUtils.toString(response.getEntity()));
                    } finally {
                        response.close();
                    }
                } finally {
                    httpclient.close();
                }
    

    显示通过身份验证代理通过隧道建立的安全连接上的HTTP请求执行。

    
            CredentialsProvider credsProvider = new BasicCredentialsProvider();
            credsProvider.setCredentials(
                    new AuthScope("localhost", 8888),
                    new UsernamePasswordCredentials("squid", "squid"));
            credsProvider.setCredentials(
                    new AuthScope("httpbin.org", 80),
                    new UsernamePasswordCredentials("user", "passwd"));
            CloseableHttpClient httpclient = HttpClients.custom()
                    .setDefaultCredentialsProvider(credsProvider).build();
            try {
                HttpHost target = new HttpHost("httpbin.org", 80, "http");
                HttpHost proxy = new HttpHost("localhost", 8888);
    
                RequestConfig config = RequestConfig.custom()
                    .setProxy(proxy)
                    .build();
                HttpGet httpget = new HttpGet("/basic-auth/user/passwd");
                httpget.setConfig(config);
    
                System.out.println("Executing request " + httpget.getRequestLine() + " to " + target + " via " + proxy);
    
                CloseableHttpResponse response = httpclient.execute(target, httpget);
                try {
                    System.out.println("----------------------------------------");
                    System.out.println(response.getStatusLine());
                    System.out.println(EntityUtils.toString(response.getEntity()));
                } finally {
                    response.close();
                }
            } finally {
                httpclient.close();
            }
        
    

    本地HTTP上下文填充的自定义属性。

    
            CloseableHttpClient httpclient = HttpClients.createDefault();
            try {
                // 创建cookie存储的本地实例
                CookieStore cookieStore = new BasicCookieStore();
    
                // 创建本地HTTP上下文
                HttpClientContext localContext = HttpClientContext.create();
                // 将自定义Cookie存储绑定到本地上下文
                localContext.setCookieStore(cookieStore);
    
                HttpGet httpget = new HttpGet("http://httpbin.org/cookies");
                System.out.println("Executing request " + httpget.getRequestLine());
    
                // 传递本地上下文作为参数
                CloseableHttpResponse response = httpclient.execute(httpget, localContext);
                try {
                    System.out.println("----------------------------------------");
                    System.out.println(response.getStatusLine());
                    List<Cookie> cookies = cookieStore.getCookies();
                    for (int i = 0; i < cookies.size(); i++) {
                        System.out.println("Local cookie: " + cookies.get(i));
                    }
                    EntityUtils.consume(response.getEntity());
                } finally {
                    response.close();
                }
            } finally {
                httpclient.close();
            }
        
    

    HttpContext的生命周期从服务器接收的HTTP请求开始到反应发送回客户端结束。

    HttpClient执行基于表单的登录。

    
            BasicCookieStore cookieStore = new BasicCookieStore();
            CloseableHttpClient httpclient = HttpClients.custom()
                    .setDefaultCookieStore(cookieStore)
                    .build();
            try {
                HttpGet httpget = new HttpGet("https://someportal/");
                CloseableHttpResponse response1 = httpclient.execute(httpget);
                try {
                    HttpEntity entity = response1.getEntity();
    
                    System.out.println("Login form get: " + response1.getStatusLine());
                    EntityUtils.consume(entity);
    
                    System.out.println("Initial set of cookies:");
                    List<Cookie> cookies = cookieStore.getCookies();
                    if (cookies.isEmpty()) {
                        System.out.println("None");
                    } else {
                        for (int i = 0; i < cookies.size(); i++) {
                            System.out.println("- " + cookies.get(i).toString());
                        }
                    }
                } finally {
                    response1.close();
                }
    
                HttpUriRequest login = RequestBuilder.post()
                        .setUri(new URI("https://someportal/"))
                        .addParameter("IDToken1", "username")
                        .addParameter("IDToken2", "password")
                        .build();
                CloseableHttpResponse response2 = httpclient.execute(login);
                try {
                    HttpEntity entity = response2.getEntity();
    
                    System.out.println("Login form get: " + response2.getStatusLine());
                    // 关闭流
                    EntityUtils.consume(entity);
                    System.out.println("登录后的cookie信息");
                    List<Cookie> cookies = cookieStore.getCookies();
                    if (cookies.isEmpty()) {
                        System.out.println("None");
                    } else {
                        for (int i = 0; i < cookies.size(); i++) {
                            System.out.println("- " + cookies.get(i).toString());
                        }
                    }
                } finally {
                    response2.close();
                }
            } finally {
                httpclient.close();
            }
    

    基本上就是一个post请求携带参数,并且得到登录后cookie的信息。(cookie实在不安全==!)

    相关文章

      网友评论

          本文标题:Httpclient(一)

          本文链接:https://www.haomeiwen.com/subject/tksydktx.html