【问题标题】:Unable to implement POST method in spring boot无法在 Spring Boot 中实现 POST 方法
【发布时间】:2019-10-13 23:02:51
【问题描述】:

我正在尝试实现一个简单的 POST 方法,但无法这样做。

尝试了“stackoverflow”中提到的几种解决方案,仍然出现错误。

我的控制器类

@RestController
@RequestMapping("api/public")
public class PublicRestApiController {

@GetMapping("users")
public List<User> users(){
    return this.userRepository.findAll();
}

@PostMapping(path="/insert",produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(value = HttpStatus.ACCEPTED)
 public User add(@RequestBody UserRequest account) {
    User response = new User(account.getUsername(),account.getPassword(),account.getRoles(), account.getPermissions());
    return response;
    }

}

用户请求类

public class UserRequest {

public String getUsername() {
    return username;
}
public void setUsername(String username) {
    this.username = username;
}
public String getPassword() {
    return password;
}
public void setPassword(String password) {
    this.password = password;
}
public int getActive() {
    return active;
}
public void setActive(int active) {
    this.active = active;
}
public String getRoles() {
    return roles;
}
public void setRoles(String roles) {
    this.roles = roles;
}
public String getPermissions() {
    return permissions;
}
public void setPermissions(String permissions) {
    this.permissions = permissions;
}
private String username;
private String password;
private int active;
private String roles = "";
private String permissions = "";

}

用户类

@Entity
@Table(name = "USER_DETAILS")
public class User {

@Id
@Column
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;

@Column(nullable = false)
private String username;

@Column(nullable = false)
private String PASSWORD;

@Column
private int ACTIVE;

@Column
private String ROLES = "";

@Column
private String PERMISSIONS = "";

public User(String username, String password, String roles, String permissions){
    this.username = username;
    this.PASSWORD = password;
    this.ROLES = roles;
    this.PERMISSIONS = permissions;
    this.ACTIVE = 1;
}

public User(){}

public int getId() {
    return id;
}

public String getUsername() {
    return username;
}

public String getPassword() {
    return PASSWORD;
}

public int getActive() {
    return ACTIVE;
}

public String getRoles() {
    return ROLES;
}

public String getPermissions() {
    return PERMISSIONS;
}

public void setId(int id) {
    this.id = id;
}

public void setUsername(String username) {
    this.username = username;
}

public void setPassword(String password) {
    this.PASSWORD = password;
}

public void setActive(int active) {
    this.ACTIVE = active;
}

public void setRoles(String roles) {
    this.ROLES = roles;
}

public void setPermissions(String permissions) {
    this.PERMISSIONS = permissions;
}
}

出现此错误消息。

2019-05-28 17:08:41.808  WARN 7712 --- [nio-8443-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method 'GET' not supported]

GET 方法在同一个控制器中工作正常,只是在尝试实现 POST 实现时出错。

Request screenshot through Postman

安全配置

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers("/api/public/users").hasRole("ADMIN")
      .antMatchers("/api/public/insert").hasRole("ADMIN")
      .and()
      .httpBasic();
}

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

}

应用类

@SpringBootApplication(scanBasePackages = {"rc.bootsecurity"})
public class BootSecurityApplication {

public static void main(String[] args) {
    SpringApplication.run(BootSecurityApplication.class, args);
}

@Bean
public ServletWebServerFactory servletContainer() {
    // Enable SSL Trafic
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
        @Override
        protected void postProcessContext(Context context) {
            SecurityConstraint securityConstraint = new SecurityConstraint();
            securityConstraint.setUserConstraint("CONFIDENTIAL");
            SecurityCollection collection = new SecurityCollection();
            collection.addPattern("/*");
            securityConstraint.addCollection(collection);
            context.addConstraint(securityConstraint);
        }
    };

    // Add HTTP to HTTPS redirect
    tomcat.addAdditionalTomcatConnectors(httpToHttpsRedirectConnector());

    return tomcat;
}

private Connector httpToHttpsRedirectConnector() {
    Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    connector.setScheme("http");
    connector.setPort(8082);
    connector.setSecure(false);
    connector.setRedirectPort(8443);
    return connector;
    }
}

【问题讨论】:

  • 附加错误告诉请求方法'GET'不支持这是正确的。因为你的控制器是 POST ......你如何确保 GET 方法工作......
  • 有时服务器缓存会产生这类问题。清除服务器缓存并重新启动服务器。同样在邮递员中检查标题是否检查了内容类型。
  • 从错误消息看来,邮递员请求是作为GET 请求而不是POST 发送的。当重定向发生时,这似乎是可能的,如herehere 所示。请验证您是否在某处使用重定向。
  • 您是否启用了Spring Security?如果是这样,您可能会被重定向到“拒绝访问”页面。
  • @g00glen00b 是的,我从 http -> https 重定向。有什么办法可以解决这个问题?

标签: spring-boot post postman


【解决方案1】:

可能的解决方案 1:

  1. 打开邮递员
  2. 使用文件部分转到设置
  3. 关闭自动跟随重定向


可能的解决方案 2:

添加extra / (trailing slash) to your endPointapi/public/insert 更改为api/public/insert/


Postman 支持关于 我发送了一个 POST 请求,但 Postman 似乎正在发送一个 GET 请求。

这主要是由于服务器端重定向。如果邮递员收到 301 或 302 响应码,它会自动跟随重定向。 与浏览器中的行为类似,原始请求方法将 不被保留,重定向的请求将使用 GET 方法。如果您想禁用自动关注重定向行为,或者 如果您对此有其他疑问,请查看相关的 重定向文档

Postman SupportInterceptor extensionGit Issue


更新:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
      .csrf().disable()
      .authorizeRequests()
      .antMatchers("/api/public/users").hasRole("ADMIN")
      .antMatchers(HttpMethod.POST,"/api/public/insert").hasRole("ADMIN")
      .anyRequest().authenticated();
}

【讨论】:

  • 我已经更新了问题中的安全类和应用程序类。获取方法工作正常。 POST 不是。我已尝试过您的两种解决方案。没有收到禁止错误。
  • @SrijibSen 所以现在你的帖子请求是作为 POST 而不是 GET 发送的,现在你得到 403 Forbidden 纠正我,如果我错了,哪个解决方案对你有用
  • 现在它正在工作。我已根据您的建议更改了 Postman 的设置并更新了代码。非常感谢。
  • 欢迎@SrijibSen
  • 你能帮我解决关于相同代码的另一个问题吗??
猜你喜欢
  • 2021-01-21
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2016-02-15
  • 2019-02-19
  • 2017-11-02
  • 2015-12-05
相关资源
最近更新 更多