You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot调用HTTPS接口报500错误求助(原HTTP正常)

问题分析与解决方案

我来帮你拆解这个问题——你之前用HTTP调用PHP服务器完全正常,切换到HTTPS后就碰到了500内部服务器错误,这个问题大概率和HTTPS适配或者服务器端的处理逻辑有关,咱们一步步来排查解决:

问题核心信息

背景

你正在开发Spring Boot应用,通过RestTemplate向PHP服务器发送JSON数据,HTTP协议下运行正常,但切换到HTTPS地址https://develop.siteonline.com.br/services/export.pl.php后,Spring抛出HttpServerErrorException: 500 Internal Server Error。

关键请求代码

public void sendListPayload(int count, List object, String controller) throws NoSuchAlgorithmException, IOException { 
    String newSignature = ""; 
    Control type = Control.valueOf(controller); 
    String payload = ""; 
    RestTemplate restTemplate = new RestTemplate(); 
    String url = "https://develop.siteonline.com.br/services/export.pl.php"; 
    HttpHeaders headers; 
    payload = convertListToJson(object); 
    headers = newGetHeaders(payload); 
    headers.setContentType(MediaType.APPLICATION_JSON); 
    HttpEntity<String> entity = new HttpEntity<>(payload, headers); 
    restTemplate.getMessageConverters() 
            .add(0, new StringHttpMessageConverter(Charset.forName("UTF-8"))); 
    String answer = restTemplate.postForObject(url, entity, String.class); 
    log.info("Classe: " + type + "" + answer); 
}

错误堆栈信息

29-03-2019 17:30:48.105 [http-nio-8081-exec-4] ERROR o.a.c.c.C.[.[.[.[dispatcherServlet].log - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error] with root cause 
org.springframework.web.client.HttpServerErrorException: 500 Internal Server Error 
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:97) 
    at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:79) 
    at org.springframework.web.client.ResponseErrorHandler.handleError(ResponseErrorHandler.java:63) 
    at org.springframework.web.client.RestTemplate.handleResponse(RestTemplate.java:775) 
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:728) 
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:684) 
    at org.springframework.web.client.RestTemplate.postForObject(RestTemplate.java:435) 
    at com.speedsoft.bws.useful.Useful.sendListPayload(Useful.java:211) 
    at com.speedsoft.bws.useful.Useful.testSendListPayload(Useful.java:86) 
    at com.speedsoft.bws.controller.PeriodoLetivoController.createPostPeriodo(PeriodoLetivoController.java:56) 
    at com.speedsoft.bws.controller.PeriodoLetivoController.testPost(PeriodoLetivoController.java:35) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:877) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:783) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974) 
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:866) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:635) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
    at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
    at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
    at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
    at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) 
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) 
    at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) 
    at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
    at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) 
    at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) 
    at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:748)

发送的JSON数据

[{"periodoID":12,"nomePeriodo":"2012","inicio":"2012-01-01T02:00:00Z","fim":"2012-12-31T02:00:00Z"}, {"periodoID":13,"nomePeriodo":"2013","inicio":"2013-01-01T02:00:00Z","fim":"2013-12-31T02:00:00Z"}]

排查与解决步骤

1. 优先排查PHP服务器的错误日志

500是服务器内部错误,最直接的方式是查看PHP端的日志:

  • 查看Apache的error.log或者PHP的php_error.log,里面会记录具体的错误原因,比如证书验证失败、权限不足、请求数据读取异常等。
  • 用curl或Postman直接调用HTTPS接口,发送相同的JSON数据,测试是否能得到更详细的错误提示:
curl -X POST -H "Content-Type: application/json" -d '[{"periodoID":12,"nomePeriodo":"2012","inicio":"2012-01-01T02:00:00Z","fim":"2012-12-31T02:00:00Z"}, {"periodoID":13,"nomePeriodo":"2013","inicio":"2013-01-01T02:00:00Z","fim":"2013-12-31T02:00:00Z"}]' https://develop.siteonline.com.br/services/export.pl.php

2. 检查RestTemplate的SSL证书信任配置

Spring默认的RestTemplate可能不信任PHP服务器的SSL证书(比如自签名证书),这会导致请求异常:

  • 可以临时配置一个跳过证书验证的RestTemplate来测试:
private RestTemplate createSslIgnoredRestTemplate() throws KeyManagementException, NoSuchAlgorithmException {
    TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
    SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
            .loadTrustMaterial(null, acceptingTrustStrategy)
            .build();
    SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext);
    CloseableHttpClient httpClient = HttpClients.custom()
            .setSSLSocketFactory(csf)
            .build();
    HttpComponentsClientHttpRequestFactory requestFactory =
            new HttpComponentsClientHttpRequestFactory();
    requestFactory.setHttpClient(httpClient);
    return new RestTemplate(requestFactory);
}

如果用这个RestTemplate请求正常,说明是证书信任问题,后续需要将服务器证书导入Java信任库,不要一直用跳过验证的方式。

3. 检查请求签名或头信息的协议依赖

如果你的newGetHeaders(payload)方法里包含签名计算,要确认签名是否依赖于协议(HTTP/HTTPS):

  • 比如签名是基于请求URL、参数和协议生成的,切换到HTTPS后签名失效,服务器端验证失败就会抛出500错误。

4. 验证PHP端的POST数据读取逻辑

确保PHP在HTTPS环境下能正常读取JSON数据:

  • 检查PHP代码是否用file_get_contents('php://input')读取POST数据,同时确认服务器的post_max_size、upload_max_filesize配置是否足够容纳你的JSON数据。

内容的提问来源于stack exchange,提问作者lisa andrews markitks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:14:16