Résoudre le problème d'erreur de l'interface de requête https en Java

1. Résolvez l'exception SSL : le certificat pour

1.1 Description du problème

Récemment, je travaille sur un projet de service client Q&A intelligent, qui est connecté à l'interface Yunwen. Ensuite, l'interface Yunwen est connectée en utilisant la méthode https. Avant, c'était toujours la méthode http. Le changement soudain a provoqué une erreur lors de l'accès au projet. Le message d'erreur est tel qu'indiqué dans le titre. C'est un problème avec le certificat SSL.

1.2 Solutions

Première solution :

Lorsque vous rencontrez un problème, commencez par le déboguer et constatez que l'erreur est causée par une classe d'outils dans le projet. Il semble que ce soit parce qu'il n'est pas prévu d'utiliser un certificat par défaut. Je ne sais pas si je comprends bien. Quoi qu'il en soit, après l'avoir modifié selon le code suivant, tout va bien, mais il y aura encore d'autres problèmes, que vous pouvez lire ci-dessous.

Sur le code précédent, c'est-à-dire le code qui envoie la requête http, ajoutez les deux instructions suivantes. Sa fonction principale est de configurer HttpClient avec une connexion sécurisée SSL/TSL.

SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(), NoopHostnameVerifier.INSTANCE);
httpclient = HttpClients.custom().setSSLSocketFactory(scsf).build();

Le code corrigé est le suivant :

public static String doGet(String url, Map<String, Object> params) throws IOException {
    
      
        String apiUrl = url;  
        StringBuffer param = new StringBuffer();  
        int i = 0;  
        for (String key : params.keySet()) {
    
      
            if (i == 0)  
                param.append("?");  
            else  
                param.append("&");  
            param.append(key).append("=").append(params.get(key));  
            i++;  
        }  
        apiUrl += param;  
        String result = null;  
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {
    
    
            SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory(SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(), NoopHostnameVerifier.INSTANCE);
            httpclient = HttpClients.custom().setSSLSocketFactory(scsf).build();

            HttpGet httpPost = new HttpGet(apiUrl);  
            HttpResponse response = httpclient.execute(httpPost);

            HttpEntity entity = response.getEntity();  
            if (entity != null) {
    
      
                InputStream instream = entity.getContent();  
                result = IOUtils.toString(instream, "UTF-8");  
            }  
        } catch (Exception e) {
    
      
            e.printStackTrace();  
        }
        } finally {
    
    
        	if(httpclient!=null) {
    
    
        		httpclient.close();
        	}
        }
        return result;  
    }  

Deuxième solution :

Cette solution a été proposée par ChatGPT et je n'ai pas vérifié son exactitude.

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
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.ssl.SSLContextBuilder;

import javax.net.ssl.SSLContext;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class HTTPSRequestExample {
    
    
    public static void main(String[] args) {
    
    
        try {
    
    
            // 创建自定义SSLContext
            SSLContext sslContext = SSLContextBuilder.create().loadTrustMaterial((chain, authType) -> true).build();

            // 创建SSLConnectionSocketFactory并禁用主机名验证
            SSLConnectionSocketFactory sslSocketFactory = new SSLConnectionSocketFactory(sslContext, NoopHostnameVerifier.INSTANCE);

            // 使用自定义SSLConnectionSocketFactory创建HttpClient
            CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslSocketFactory).build();

            // 创建要发送的GET请求
            HttpGet request = new HttpGet("https://example.com");

            // 发送请求并获取响应
            CloseableHttpResponse response = httpClient.execute(request);

            // 读取响应内容
            BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            String line;
            StringBuilder content = new StringBuilder();
            while ((line = reader.readLine()) != null) {
    
    
                content.append(line);
            }

            // 输出响应内容
            System.out.println("Response Content: " + content.toString());

        } catch (Exception e) {
    
    
            e.printStackTrace();
        } finally {
    
    
            if (response != null) {
    
    
                response.close();
            }
            if (httpClient != null) {
    
    
                httpClient.close();
            }
        }
    }
}

1.3 Références

documentation de référence de stackoverflow

Document de référence du RPSC

2. De nouveaux problèmes surgissent

Après avoir modifié le code ci-dessus, de nouveaux problèmes apparaîtront. Les images, les audios et les vidéos ne semblent pas fonctionner. F12 signalera une erreur sur la console, qui semble être liée au certificat. En même temps, le chemin demandé sera être remplacé par un chemin local. L'erreur est signalée comme indiqué dans la figure ci-dessous.

image-20231106114630319

Je suppose que tu aimes

Origine blog.csdn.net/qq_43907505/article/details/134258974
conseillé
Classement