在 Apache2 中从 Angular 运行 向 spring 引导 api 发送请求时找不到 404
404 not found when sending requests to spring boot api from Angular running in Apache2
我有一个带有 spring-boot 后端 api 和 Angular10 前端的应用程序。当 运行 在本地设置这些时,我没有任何问题,一切 运行 都很好。我已经在 Debian VPS 上部署了我的应用程序,在 apache2 上使用 Angular build 运行ning。但是当我试图在那里发送请求时,我得到一个 402 not found tot the requested URL.
在 Apache 中我配置了一个反向代理来访问 spring boot:
<VirtualHost *:80>
DocumentRoot /var/www/html
ProxyPass /api/ http://localhost:8080/
ProxyPassReverse /api/ http://37.128.150.186/api/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
在 Angular 的 environment.ts 文件中,我指定了 url 的基址,例如“/api/”,因此每个请求都将通过这些 URLS 与 Apache 的基本端口 (:80)。但是当这样做时,我得到一个 404 not found。但是当我在 URL 中转到 /api/ 时,我确实看到 Spring Boot.
的“家庭控制器”
尝试将 post 发送到 spring 时浏览器中的请求-引导控制器:
Request URL: http://37.128.150.186/api/users
Request Method: POST
Status Code: 404
Remote Address: 37.128.150.186:80
Referrer Policy: strict-origin-when-cross-origin
错误响应:
"timestamp": "2021-05-02T21:15:46.970+00:00",
"status": 404,
"error": "Not Found",
"message": "",
"path": "//users"
在此示例中,我尝试向其发送请求的控制器:
@RestController
@RequestMapping(value = "/api/users", produces = MediaType.APPLICATION_JSON_VALUE)
public class UserController {
private final UserService userService;
private final PasswordEncoder encoder;
public UserController(final UserService userService, final PasswordEncoder encoder) {
this.userService = userService;
this.encoder = encoder;
}
@GetMapping
public ResponseEntity<List<UserDTO>> getAllUsers() {
return ResponseEntity.ok(userService.findAll());
}
@GetMapping("/{id}")
public ResponseEntity<UserDTO> getUser(@PathVariable final Long id) {
return ResponseEntity.ok(userService.get(id));
}
/**
*
* @param userDTO user type to create new user
* @return user written to the database
*/
@PostMapping
public ResponseEntity<Long> createUser(@RequestBody @Valid final UserDTO userDTO) {
// create new user
UserDTO newUser = new UserDTO();
// set email
newUser.setEmail(userDTO.getEmail());
// set firstname
newUser.setFirstName(userDTO.getFirstName());
// set lastname
newUser.setLastName(userDTO.getLastName());
// set hashed password
newUser.setPassword(encoder.encode(userDTO.getPassword()));
// return new user with hashed password
return new ResponseEntity<>(userService.create(newUser), HttpStatus.CREATED);
}
@PutMapping("/{id}")
public ResponseEntity<Void> updateUser(@PathVariable final Long id,
@RequestBody @Valid final UserDTO userDTO) {
userService.update(id, userDTO);
return ResponseEntity.ok().build();
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable final Long id) {
userService.delete(id);
return ResponseEntity.noContent().build();
}
}
再次,当我 运行 本地计算机上的应用程序一切正常时。我是不是忘记配置什么了?
错误来自 spring 本身。
我认为错误在于您在一个配置文件中配置了上下文路径,但在另一个配置文件中没有配置。 (如果你点击 http://37.128.150.186/api/api/users 你会得到回应)。
也可能是一个问题是
ProxyPassReverse /api/ http://37.128.150.186/api/
我不确定 /api/ 是否需要附加到 IP。
如果没有 @Autowired 或 @Inject 注解
则不能添加构造函数参数
就会那样view reference link
@Autowired
public UserController(@Qualifier("questionService") UserService userService, @Qualifier("encoder") PasswordEncoder encoder) {
this.userService = userService;
this.encoder = encoder;
}
或者
@Inject
public UserController(@Named("questionService") UserService userService, @Named("encoder") PasswordEncoder encoder) {
this.userService = userService;
this.encoder = encoder;
}
我有一个带有 spring-boot 后端 api 和 Angular10 前端的应用程序。当 运行 在本地设置这些时,我没有任何问题,一切 运行 都很好。我已经在 Debian VPS 上部署了我的应用程序,在 apache2 上使用 Angular build 运行ning。但是当我试图在那里发送请求时,我得到一个 402 not found tot the requested URL.
在 Apache 中我配置了一个反向代理来访问 spring boot:
<VirtualHost *:80>
DocumentRoot /var/www/html
ProxyPass /api/ http://localhost:8080/
ProxyPassReverse /api/ http://37.128.150.186/api/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
在 Angular 的 environment.ts 文件中,我指定了 url 的基址,例如“/api/”,因此每个请求都将通过这些 URLS 与 Apache 的基本端口 (:80)。但是当这样做时,我得到一个 404 not found。但是当我在 URL 中转到 /api/ 时,我确实看到 Spring Boot.
的“家庭控制器”尝试将 post 发送到 spring 时浏览器中的请求-引导控制器:
Request URL: http://37.128.150.186/api/users
Request Method: POST
Status Code: 404
Remote Address: 37.128.150.186:80
Referrer Policy: strict-origin-when-cross-origin
错误响应:
"timestamp": "2021-05-02T21:15:46.970+00:00",
"status": 404,
"error": "Not Found",
"message": "",
"path": "//users"
在此示例中,我尝试向其发送请求的控制器:
@RestController
@RequestMapping(value = "/api/users", produces = MediaType.APPLICATION_JSON_VALUE)
public class UserController {
private final UserService userService;
private final PasswordEncoder encoder;
public UserController(final UserService userService, final PasswordEncoder encoder) {
this.userService = userService;
this.encoder = encoder;
}
@GetMapping
public ResponseEntity<List<UserDTO>> getAllUsers() {
return ResponseEntity.ok(userService.findAll());
}
@GetMapping("/{id}")
public ResponseEntity<UserDTO> getUser(@PathVariable final Long id) {
return ResponseEntity.ok(userService.get(id));
}
/**
*
* @param userDTO user type to create new user
* @return user written to the database
*/
@PostMapping
public ResponseEntity<Long> createUser(@RequestBody @Valid final UserDTO userDTO) {
// create new user
UserDTO newUser = new UserDTO();
// set email
newUser.setEmail(userDTO.getEmail());
// set firstname
newUser.setFirstName(userDTO.getFirstName());
// set lastname
newUser.setLastName(userDTO.getLastName());
// set hashed password
newUser.setPassword(encoder.encode(userDTO.getPassword()));
// return new user with hashed password
return new ResponseEntity<>(userService.create(newUser), HttpStatus.CREATED);
}
@PutMapping("/{id}")
public ResponseEntity<Void> updateUser(@PathVariable final Long id,
@RequestBody @Valid final UserDTO userDTO) {
userService.update(id, userDTO);
return ResponseEntity.ok().build();
}
@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteUser(@PathVariable final Long id) {
userService.delete(id);
return ResponseEntity.noContent().build();
}
}
再次,当我 运行 本地计算机上的应用程序一切正常时。我是不是忘记配置什么了?
错误来自 spring 本身。 我认为错误在于您在一个配置文件中配置了上下文路径,但在另一个配置文件中没有配置。 (如果你点击 http://37.128.150.186/api/api/users 你会得到回应)。
也可能是一个问题是
ProxyPassReverse /api/ http://37.128.150.186/api/
我不确定 /api/ 是否需要附加到 IP。
如果没有 @Autowired 或 @Inject 注解
则不能添加构造函数参数
就会那样view reference link
@Autowired
public UserController(@Qualifier("questionService") UserService userService, @Qualifier("encoder") PasswordEncoder encoder) {
this.userService = userService;
this.encoder = encoder;
}
或者
@Inject
public UserController(@Named("questionService") UserService userService, @Named("encoder") PasswordEncoder encoder) {
this.userService = userService;
this.encoder = encoder;
}