zoukankan      html  css  js  c++  java
  • springMVC、https、GET调用别人提供的接口!!!

    import org.apache.http.HttpEntity;
    import org.apache.http.HttpHost;
    import org.apache.http.HttpStatus;
    import org.apache.http.auth.AuthScope;
    import org.apache.http.auth.UsernamePasswordCredentials;
    import org.apache.http.client.CredentialsProvider;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpGet;
    import org.apache.http.client.protocol.HttpClientContext;
    import org.apache.http.config.Registry;
    import org.apache.http.config.RegistryBuilder;
    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.conn.ssl.SSLContextBuilder;
    import org.apache.http.conn.ssl.SSLContexts;
    import org.apache.http.conn.ssl.TrustStrategy;
    import org.apache.http.impl.auth.BasicScheme;
    import org.apache.http.impl.client.BasicAuthCache;
    import org.apache.http.impl.client.BasicCredentialsProvider;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClientBuilder;
    import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
    import org.apache.http.util.EntityUtils;
    import sun.net.www.protocol.http.AuthCache;
    
    import javax.net.ssl.SSLContext;
    import javax.swing.*;
    import java.io.IOException;
    import java.security.KeyManagementException;
    import java.security.KeyStore;
    import java.security.KeyStoreException;
    import java.security.NoSuchAlgorithmException;
    import java.security.cert.CertificateException;
    import java.security.cert.X509Certificate;
    
    /**
     * Created by zml on 16-11-16.
     * https的GET方式调用别人的接口,其实也可以用于http协议的,注意看代码的注释
     */
    public class HttpsGET {
        //如果给的链接是www.baidu.com这种域名而不是IP,就在cmd黑窗口ping一下域名就可以得到IP地址
        String ip = "xxxx.xxx.xx.xx";
        //如果给的链接没有端口号,则默认写为-1
        int port = -1;
        //接口调用所使用的协议
        String protocol = "https";
    
        String username = "zhangsan";
        String password = "password";
    
    
        public String httpsRequestsGet(String apiUrl){
    
            String responseBody = "";
            //注册协议并获取链接对象
            CloseableHttpClient httpClient = getHttpClient();
    
            HttpHost targetHost = new HttpHost(ip,port,protocol);
    
            //验证主机名端口号和用户名密码
            CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(new AuthScope(targetHost.getHostName(),targetHost.getPort()),
                                               new UsernamePasswordCredentials(username,password));
    
            org.apache.http.client.AuthCache authScope = new BasicAuthCache();
            BasicScheme basicScheme = new BasicScheme();
    
            authScope.put(targetHost,basicScheme);
    
            HttpClientContext context = HttpClientContext.create();
            context.setCredentialsProvider(credentialsProvider);
            context.setAuthCache(authScope);
    
            String url = protocol + "://" + ip + ":" + port + apiUrl;
    
            //GET方式调用接口
            HttpGet httpGet = new HttpGet(url);
    
            CloseableHttpResponse response = null;
            try {
                //链接目标主机,接收目标主机返回的对象
                response = httpClient.execute(targetHost,httpGet,context);
            } catch (IOException e) {
                e.printStackTrace();
            }
            int status = response.getStatusLine().getStatusCode();
    
            if(status== HttpStatus.SC_OK){
                HttpEntity entity = response.getEntity();
                try {
                    responseBody = EntityUtils.toString(entity);
                } catch (IOException e) {
                    e.printStackTrace();
                }finally {
                    try {
                        //关闭连接
                        response.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
    
            return responseBody;
        }
    
        private static CloseableHttpClient getHttpClient() {
            RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.<ConnectionSocketFactory>create();
            ConnectionSocketFactory plainSF = new PlainConnectionSocketFactory();
            //注册http协议,如果不需要http协议就不需要写。
            registryBuilder.register("http",plainSF);
    
            //以下是注册https协议,与http不同的是多了证书的校验
            try {
                KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
                TrustStrategy trustStrategy = new TrustStrategy() {
                    @Override
                    public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException {
                        return true;
                    }
                };
    
                SSLContext sslContext = SSLContexts.custom().useTLS().loadTrustMaterial(trustStore, trustStrategy).build();
                //允许全部的证书,这样访问的时候就不用去校验证书是否可用。
                LayeredConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext,SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
                //注册https协议
                registryBuilder.register("https",sslsf);
    
            } catch (KeyStoreException e) {
                e.printStackTrace();
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            } catch (KeyManagementException e) {
                e.printStackTrace();
            }
    
            Registry<ConnectionSocketFactory> registry = registryBuilder.build();
            PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(registry);
    
            return HttpClientBuilder.create().setConnectionManager(connManager).build();
    
        }
    }

    所依赖的jar为

     <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.3.5</version>
            </dependency>
    

      

  • 相关阅读:
    你看那个人他像一条狗
    jvm系列(八):jvm知识点总览
    jvm系列(七):jvm调优-工具篇
    百亿互金平台救火故事
    一个脚本引发的血案
    一次dns缓存引发的惨案
    一次生产事故的优化经历
    从零到百亿互联网金融架构发展史
    2016颠倒梦想,2017静心前行
    Spring Boot(九):定时任务
  • 原文地址:https://www.cnblogs.com/zml-java/p/6069894.html
Copyright © 2011-2022 走看看