Невозможно реализовать метод POST при весенней загрузке - PullRequest
0 голосов
/ 28 мая 2019

Я пытаюсь реализовать простой метод 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;
    }

}

UserRequest класс

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.

Запрос скриншота через почтальона

Конфигурация безопасности

@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;
    }
}

1 Ответ

0 голосов
/ 28 мая 2019

Возможное решение 1:

  1. Открытый почтальон
  2. Перейти в настройки, используя раздел файла
  3. Выключить Автоматически следовать перенаправлениям

enter image description here


Возможное решение 2:

Добавить extra / (trailing slash) to your endPoint изменить api/public/insert на api/public/insert/


Что говорит служба поддержки Postman о Я отправил запрос POST, но, похоже, Postman отправляет запрос GET.

Это в основном из-за перенаправления на стороне сервера. Если почтальон получает Код ответа 301 или 302, он будет автоматически следовать за перенаправлением. Подобно поведению в браузерах, оригинальный метод запроса будет НЕ сохраняется, и перенаправленный запрос будет сделан с GET метод. Если вы хотите отключить функцию автоматического перенаправления, или если у вас есть другие вопросы по этому поводу, пожалуйста, просмотрите соответствующие документация по перенаправлениям

Поддержка почтальона Расширение перехватчика Git 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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...