404 応答が返ってくるということは、名前解決はできてクライアントからの要求はサーバーに届いていて、サーバーで url に指定されているリソースを探したが見つからなかったということです。原因はほとんどが指定した url が間違っているということです。なのでそこを調べてください。できれば質問する前に。
間違いには、単純なスペルミス、相対パスの間違い、ルーティングの間違い、要求するサーバーの間違いなどがあります。ほとんどは質問者さんでないと分からないことです。
APIのリクエストが404になってしまう
例)
springbootでAPIを作成しています。
jsonを受け取る→DBで検索取得→レスポンスを返すような流れです。
コントローラーで/userを定義しており、以下のcurl文を投げたのですが404 not foundが返却されている状態です。
curl -X POST http://localhost:8081/user -H "Content-Type: application/json" -d '{"id": 1}'
ポートは8081に変更しております。よろしくお願いいたします。
{"timestamp":"2024-03-15T01:48:57.097+00:00","status":404,"error":"Not Found","trace":"org.springframework.web.servlet.resource.NoResourceFoundException: No static resource
//コントローラー
@RestController
public class UserController {
@Autowired
private userService userService;
@PostMapping("/user")
public ResponseEntity<UserResponse> getUserById(@RequestBody UserRequest request) {
Long id = request.getId();
User user = userService.getUserById(id);
if (user != null) {
UserResponse userResponse = new UserResponse();
userResponse.setId((long) user.getId());
userResponse.setUsername(user.getItemName());
userResponse.setEmail("");
return ResponseEntity.ok(userResponse);
} else {
return ResponseEntity.notFound().build();
}
}
}
//サービス
@Service
public class userService {
@Autowired
UserMapper userMapper;
public User getUserById(Long id) {
User userEntity = userMapper.getUserById(id);
return userEntity;
}
}
404 応答が返ってくるということは、名前解決はできてクライアントからの要求はサーバーに届いていて、サーバーで url に指定されているリソースを探したが見つからなかったということです。原因はほとんどが指定した url が間違っているということです。なのでそこを調べてください。できれば質問する前に。
間違いには、単純なスペルミス、相対パスの間違い、ルーティングの間違い、要求するサーバーの間違いなどがあります。ほとんどは質問者さんでないと分からないことです。
リクエストが404 Not Foundで返ってくる原因はいくつか考えられますが、提示された情報に基づいて考えられる可能性を挙げてみます。
アプリケーションのポート設定: アプリケーションを8081ポートで実行していることを確認してください。Spring Bootのデフォルトポートは8080ですが、application.properties
やapplication.yml
ファイルでserver.port=8081
と設定してポートを変更している必要があります。
コントローラーのスキャン: Spring Bootは、アプリケーション起動時に@RestController
アノテーションがついているクラスをスキャンして自動的に登録します。しかし、このクラスがスキャンの対象外になっている場合、期待通りに動作しません。@SpringBootApplication
アノテーションがついているクラス(アプリケーションのエントリポイント)がこのコントローラーと同じパッケージか、もしくは親パッケージに存在することを確認してください。
コンテキストパスの問題: アプリケーションにコンテキストパスが設定されている場合(例えばserver.servlet.context-path=/api
)、実際のエンドポイントはコンテキストパスを含めた形(例: http://localhost:8081/api/user
)になります。application.properties
やapplication.yml
を確認して、もしコンテキストパスが設定されているなら、それをリクエストURLに含めているか確認してください。