Java发起Http/https请求

该博客展示了如何使用Apache HttpClient库在Java中发起HTTP和HTTPS请求。代码详细演示了创建带有参数和头部信息的GET请求,并且为了忽略SSL证书验证,自定义了一个SSLContext。示例还包含了一个主方法来执行请求并打印结果。
摘要由CSDN通过智能技术生成

Java发起Http/https请求

import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.URI;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;

/**
 * @author wengcy
 */
public class HttpApiTest {

    /**
     *  对目标url发起get请求
     * @param url 目标url
     * @param params 请求参数
     * @param headers 请求头
     * @return 返回结果
     */
    public static String doGet(String url, Map<String, String> params , Map<String, String> headers) {
        // 创建Httpclient对象
        CloseableHttpClient httpclient = null;
        String resultString = "";
        CloseableHttpResponse response = null;
        try {
            httpclient = SSLClient.wrapClient();
            // 创建uri
            URIBuilder builder = new URIBuilder(url);
            if (params != null) {
                for (String key : params.keySet()) {
                    builder.addParameter(key, params.get(key));
                }
            }
            URI uri = builder.build();
            // 创建http GET请求
            HttpGet httpGet = new HttpGet(uri);
            if (headers != null) {
                for (String key : headers.keySet()) {
                    httpGet.addHeader(key, headers.get(key));
                }
            }
            // 执行请求
            response = httpclient.execute(httpGet);
            // 判断返回状态是否为200
            if (response.getStatusLine().getStatusCode() == 200) {
                resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
                System.out.println("resultString:" + resultString);
            }
        } catch (Exception e) {
            System.out.println("do get error:" + e.getMessage());
        } finally {
            try {
                if (response != null) {
                    response.close();
                }
                if (httpclient != null) {
                    httpclient.close();
                }
            } catch (IOException e) {
                System.out.println("do get close error:" + e.getStackTrace());
            }
        }
        return resultString;
    }

    /**
     * 不带参数的get请求
     * @param url 请求的接口url
     * @return String 返回结果
     */
    public static String doGet(String url) {
        return doGet(url, null, null);
    }

    /**
     * 为了避免需要证书,直接初始化客户端,忽略校验过程。
     */
    public static class SSLClient {
        /**
         * 绕过证书
         * @return 返回构造完成的client
         */
        public static CloseableHttpClient wrapClient() {
            try {
                SSLContext ctx = SSLContext.getInstance("TLS");
                X509TrustManager tm = new X509TrustManager() {
                    @Override
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }

                    @Override
                    public void checkClientTrusted(X509Certificate[] arg0,
                                                   String arg1) throws CertificateException {
                    }

                    @Override
                    public void checkServerTrusted(X509Certificate[] arg0,
                                                   String arg1) throws CertificateException {
                    }
                };
                ctx.init(null, new TrustManager[] { tm }, null);
                SSLConnectionSocketFactory ssf = new SSLConnectionSocketFactory(
                        ctx, NoopHostnameVerifier.INSTANCE);
                CloseableHttpClient httpclient = HttpClients.custom()
                        .setSSLSocketFactory(ssf).build();
                return httpclient;
            } catch (Exception e) {
                return HttpClients.createDefault();
            }
        }
    }

    public static void main(String[] args) {
        Map<String,String> params = new HashMap<>();
        params.put("username", "JU4yFxhtmM1eck9XWldj2trdpKI=");
        Map<String,String> heads = new HashMap<>();
        heads.put("Content-Type", "application/json");
        heads.put("st-auth-token", "88af6583-1dd8-40be-a3a7-fb46fad90cf6");
        System.out.println("start:" + System.currentTimeMillis());
        String result = doGet("https://10.13.0.99:9999/api/user",params,heads);
        System.out.println("end:" + System.currentTimeMillis());
        System.out.println("result:" + result);
    }


}

通过doget方法可以直接对目标api发起请求,若是向http接口发请求,则把wrapClient换成Closeableclient,使用HttpClients.createDefault()即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值