Spring Boot控制器不响应POST请求

时间:2019-05-31 15:36:07

标签: java spring-boot

我正在使用具有云功能的收据打印机。它与我正在实施的服务器规范相通讯。它每隔x秒钟用POST请求轮询URL,并且POST响应中包含特定信息时,打印机将GET请求发送到该URL,以获取要打印的信息。

我将打印服务器实现为Spring Boot服务器,而POST方法遇到一些奇怪的问题,我需要一些帮助。

我的问题是从打印机到服务器的POST请求从不发送到控制器。但是,我能够将Postman的POST请求发送到完全相同的URL,并由控制器处理。

URL只是:https://www.[my-domain].com:[port-number]/cloudprint

此外,我尝试将控制器方法复制到另一个在Apache后面的Tomcat实例上运行的Spring(不是Boot)应用程序中,打印机的POST请求由控制器方法处理。我可以在Apache日志和Tomcat日志中看到它们。当前的轮询频率为10秒。

这是控制器的外观:

package com.[my-domain].[application-name].controller;

[a bunch of imports]

@RestController
@CrossOrigin
public class PrintController {
    Logger logger = LoggerFactory.getLogger(PrintController.class);

    @RequestMapping(value="/cloudprint", method=RequestMethod.POST,
            headers={"Accept=application/json"})
    @ResponseStatus(HttpStatus.CREATED)
    public @ResponseBody String printPost() { 
        logger.debug("in printPost");
        return "OK";
    }

    @RequestMapping(value="/cloudprint", method=RequestMethod.GET,
            headers={"Accept=application/json"})
    @ResponseStatus(HttpStatus.OK)
    public @ResponseBody String printGet(HttpServletRequest request) {
        logger.debug("in printGet");
        return "OK";
    }

    @RequestMapping(value="/cloudprint", method=RequestMethod.DELETE,
            headers={"Accept=application/json"})
    @ResponseStatus(HttpStatus.OK)
    public @ResponseBody String printDelete() {
        logger.debug("in printDelete");
        return "OK";
    }
}

可能是什么原因造成的?我可以测试什么来解决此问题?

4 个答案:

答案 0 :(得分:3)

您好,您正在通过HTTPS访问REST服务。您从服务器收到的消息非常清楚。

  

sun.security.validator.ValidatorException:PKIX路径构建失败:   sun.security.provider.certpath.SunCertPathBuilderException:无法执行   找到到达要求目标的有效认证路径;嵌套异常为   javax.net.ssl.SSLHandshakeException:   sun.security.validator.ValidatorException:PKIX路径构建失败:   sun.security.provider.certpath.SunCertPathBuilderException:无法执行   找到到所请求目标的有效认证路径

您尚未将证书添加到ca存储中。有关如何执行此操作的详细分步指南,请点击此处

Getting ssl.SSLHandshakeException when using REST client with header but works fine with PostMan

答案 1 :(得分:1)

每当Java尝试通过SSL(例如HTTPS,IMAPS,LDAPS)连接到另一个应用程序时,它只有在能够信任该应用程序的情况下才能连接到该应用程序。

在Java世界中处理信任的方式是您拥有一个密钥库(通常为$ JAVA_HOME / lib / security / cacerts),也称为信任库。它包含所有已知证书颁发机构(CA)证书的列表,并且Java将仅信任由这些CA之一签名的证书或该密钥库中存在的公共证书。

因此,此问题是由自签名的证书(CA未对其进行签名)或Java信任库中不存在的证书链引起的。它不信任证书,并且无法连接到应用程序。

答案 2 :(得分:1)

我不确定发出发布请求时使用哪种格式。您可以使用邮递员来验证您的应用程序可以处理哪种邮递。并发送相同的发帖请求,我相信您可以轻松找到每个示例代码。通常,当我们从html页面提交帖子时,我们使用x-www-form-urlencoded。

post methods from post man

答案 3 :(得分:0)

如果您使用Spring Boot 2 ,则可能由于csrf保护而发生。它仅影响非GET请求,默认情况下在Spring Boot 2中已打开,但在较早版本中已关闭。

所以它很好地反映了您的问题描述-尽管我不完全了解它如何通过Postman运作...但是有可能它会以某种方式自动处理...

无论如何,值得一试:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable();
  }
}