Axios 请求 returns 404 即使 URL 有效且 API 功能正常
Axios Request returns 404 even though URL is valid and the API functions correctly
我一直致力于制作一个简单的网站来处理 MySQL 图书数据库的信息。
Intro/Problem:
我已经得到了服务器(spring-boot)、数据库(MySQL)和网站(React)运行ning,因为它们是唯一的例外一个特定的 GET 请求,即使它似乎没有任何问题。
当我使用 Axios 从 GetFiveBooks 网站向服务器发出 GET 请求时出现此问题。一旦被调用,就会出现 404 错误 returned.
想法:
现在明显的问题是 URL 有问题,但似乎根本不是这样。我在浏览器中和使用 PostMan 多次调用完全相同的 URL 并且每次都 return 预期结果。接下来的事情是 Axios 可能有问题,但我也不认为这是一个问题,因为我可以 运行 另一个具有不同 URL 的 Axios 请求并且那个工作完美。
因此,如果 URL 是好的并且 Axios 是 运行ning 的预期那么可能是什么错误?
我在下面包含了我认为相关的所有代码。
代码:
Axios 请求
第一种方法是我之前提到的按预期工作的请求,第二种方法给我带来了麻烦。 URL 是从名为“Commands.js”的单独文件中提取的请注意,唯一的区别是方法的名称和它们调用的确切命令。
const getExactBook = async () => {
try{
const response = await axios.get(commands.getSpecificBook(10));
console.log(response)
} catch(error) {
}
}
const getLastFive = async () => {
try{
const response = await axios.get(commands.getFiveBooks);
console.log(response)
} catch(error) {
}
}
Commands.js class
撇开尴尬的名称不谈,这个文件似乎确实在做它应该做的工作,URLs 的构造方式几乎相同,但减去了“getSpecificBook”方法所需的一些额外格式。具有讽刺意味的是,这使得有问题的 URL 比实际工作的更简单。
const baseURL="http://localhost:8080/api";
class commands {
getSpecificBook = (id) => {
return baseURL+`/books/${id}`;
}
getFiveBooks = () => {
return baseURL+`/books`;
}
}
export default new commands();
Spring-引导 REST 控制器
这是控制器中两个最相关的映射 class。当通过网络浏览器或 Post Man 手动调用时,它们都可以工作,但只有“getSpecificBook”在被网站调用时才工作。抱歉,如果这段代码草率,这是整个过程中我理解最少的部分。
@CrossOrigin(origins="http://localhost:8080")
@GetMapping(path="/books")
public @ResponseBody Iterable<Book> getFiveBooks() {
// This returns a JSON or XML with the users
return bookRepository.findLastFive();
}
@CrossOrigin(origins="http://localhost:8080")
@GetMapping(path="/books/{id}")
public @ResponseBody List<Book> getSpecificBook(@PathVariable int id) {
return bookRepository.findBybookID(id);
}
图书资料库
这是减去导入代码后的完整 BookRepository 接口。
底部的自定义 SQL 查询确实按预期工作。 GenreID =8 仅指美国历史。
public interface BookRepository extends CrudRepository<Book, Integer>{
List<Book> findAll();
List<Book> findBybookID(int bookID);
@Query(nativeQuery=true, value= "Select * from library.Book b where genreID = 8 order by b.bookID Desc Limit 0,5")
List<Book> findLastFive();
}
这四张图片显示了 Post Man 和 Firefox 中两个请求的结果。
最后一张图片显示了在网站中发出请求时的控制台结果。第一个结果针对前面显示的“getExactBook”方法,最后一个结果针对“getLastFive”。
请注意,“favicon.ico”的 404 并不重要,我根本没有抽出时间为网站设置合适的图标。它永远不会对整个网站产生任何影响。
如果我遗漏了一些明显的东西,我深表歉意。我对此还是很陌生,不知道要寻找什么。
我注意到您没有从 commands
class 调用函数 getFiveBooks()
。这可能是复制中的错误,但值得研究,因为您需要调用该函数才能获得 url.
我注意到的另一个问题是,您实际上并没有在执行 axios 请求的函数中记录任何错误。附加 console.error
有助于在出现实际错误时进行调试。
(我也是第一次接触 SO,希望对您有所帮助)
我一直致力于制作一个简单的网站来处理 MySQL 图书数据库的信息。
Intro/Problem:
我已经得到了服务器(spring-boot)、数据库(MySQL)和网站(React)运行ning,因为它们是唯一的例外一个特定的 GET 请求,即使它似乎没有任何问题。
当我使用 Axios 从 GetFiveBooks 网站向服务器发出 GET 请求时出现此问题。一旦被调用,就会出现 404 错误 returned.
想法:
现在明显的问题是 URL 有问题,但似乎根本不是这样。我在浏览器中和使用 PostMan 多次调用完全相同的 URL 并且每次都 return 预期结果。接下来的事情是 Axios 可能有问题,但我也不认为这是一个问题,因为我可以 运行 另一个具有不同 URL 的 Axios 请求并且那个工作完美。
因此,如果 URL 是好的并且 Axios 是 运行ning 的预期那么可能是什么错误?
我在下面包含了我认为相关的所有代码。
代码:
Axios 请求
第一种方法是我之前提到的按预期工作的请求,第二种方法给我带来了麻烦。 URL 是从名为“Commands.js”的单独文件中提取的请注意,唯一的区别是方法的名称和它们调用的确切命令。
const getExactBook = async () => {
try{
const response = await axios.get(commands.getSpecificBook(10));
console.log(response)
} catch(error) {
}
}
const getLastFive = async () => {
try{
const response = await axios.get(commands.getFiveBooks);
console.log(response)
} catch(error) {
}
}
Commands.js class
撇开尴尬的名称不谈,这个文件似乎确实在做它应该做的工作,URLs 的构造方式几乎相同,但减去了“getSpecificBook”方法所需的一些额外格式。具有讽刺意味的是,这使得有问题的 URL 比实际工作的更简单。
const baseURL="http://localhost:8080/api";
class commands {
getSpecificBook = (id) => {
return baseURL+`/books/${id}`;
}
getFiveBooks = () => {
return baseURL+`/books`;
}
}
export default new commands();
Spring-引导 REST 控制器
这是控制器中两个最相关的映射 class。当通过网络浏览器或 Post Man 手动调用时,它们都可以工作,但只有“getSpecificBook”在被网站调用时才工作。抱歉,如果这段代码草率,这是整个过程中我理解最少的部分。
@CrossOrigin(origins="http://localhost:8080")
@GetMapping(path="/books")
public @ResponseBody Iterable<Book> getFiveBooks() {
// This returns a JSON or XML with the users
return bookRepository.findLastFive();
}
@CrossOrigin(origins="http://localhost:8080")
@GetMapping(path="/books/{id}")
public @ResponseBody List<Book> getSpecificBook(@PathVariable int id) {
return bookRepository.findBybookID(id);
}
图书资料库
这是减去导入代码后的完整 BookRepository 接口。 底部的自定义 SQL 查询确实按预期工作。 GenreID =8 仅指美国历史。
public interface BookRepository extends CrudRepository<Book, Integer>{
List<Book> findAll();
List<Book> findBybookID(int bookID);
@Query(nativeQuery=true, value= "Select * from library.Book b where genreID = 8 order by b.bookID Desc Limit 0,5")
List<Book> findLastFive();
}
这四张图片显示了 Post Man 和 Firefox 中两个请求的结果。
最后一张图片显示了在网站中发出请求时的控制台结果。第一个结果针对前面显示的“getExactBook”方法,最后一个结果针对“getLastFive”。
请注意,“favicon.ico”的 404 并不重要,我根本没有抽出时间为网站设置合适的图标。它永远不会对整个网站产生任何影响。
如果我遗漏了一些明显的东西,我深表歉意。我对此还是很陌生,不知道要寻找什么。
我注意到您没有从 commands
class 调用函数 getFiveBooks()
。这可能是复制中的错误,但值得研究,因为您需要调用该函数才能获得 url.
我注意到的另一个问题是,您实际上并没有在执行 axios 请求的函数中记录任何错误。附加 console.error
有助于在出现实际错误时进行调试。
(我也是第一次接触 SO,希望对您有所帮助)