Я пытаюсь реализовать простой метод 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.
Запрос скриншота через 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
. Это возможно, когда происходит перенаправление, как показано здесь и здесь. Пожалуйста, проверьте, используете ли вы где-то перенаправления или нет.
Вы включили Spring Security
? Если это так, возможно, вас перенаправляют на страницу «Отказано в доступе».
@ g00glen00b Да, я перенаправляюсь с http -> https. Что можно сделать, чтобы решить эту проблему?
Possible Solution 1:
Possible Solution 2:
Добавьте extra / (trailing slash) to your endPoint
изменить api/public/insert
на api/public/insert/
Что служба поддержки почтальонов говорит о Я отправил запрос POST, но Почтальон, похоже, отправляет запрос GET.
This is mostly due to a server-side redirect. If Postman receives a 301 or 302 response code, it will automatically follow the redirect. Similar to the behaviour in browsers, the original request method will NOT be preserved, and the redirected request will be made with a GET method. If you want to disable the auto-follow redirect behaviour, or if you have other questions regarding this, please review the relevant documentation on redirects
Поддержка почтальонаРасширение перехватчикаGit-выпуск
ОБНОВИТЬ:
@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();
}
Я обновил свой класс безопасности и класс приложения в вопросе. Метод Get работает нормально. POST нет. Я пробовал оба ваших решения. Не получает Запрещенную ошибку.
@SrijibSen, так что теперь ваш почтовый запрос отправляется как POST вместо GET, и теперь вы получаете 403 Forbidden, поправьте меня, если я ошибаюсь, и какое решение сработало для вас
теперь это работает. Я изменил настройки Postman и обновил код в соответствии с вашим советом. Большое спасибо.
Добро пожаловать @SrijibSen
Можете ли вы помочь мне с другой проблемой, касающейся того же кода??
@SrijibSen Я попытаюсь решить эту проблему, вы можете обновить вопрос здесь или задать новый вопрос в соответствии с вашими потребностями.
Прикрепленная ошибка говорит о том, что метод запроса «GET» не поддерживается, что правильно. Поскольку ваш контроллер POST... как убедиться, что метод GET работает....