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
相关产品推荐
相关产品推荐

