读书笔记《building-restful-web-services-with-spring-5-second-edition》构建REST客户端和错误处理
在前面的章节中,我们介绍了 RESTful Web 服务的服务器端,包括 CRUD 操作。在这里,我们可以检查如何在代码本身中使用这些 API。 REST 客户端将帮助我们实现这一目标。
在本章中,我们将讨论以下主题:
- RestTemplate in Spring
- Basic setup for building a RESTful service client with Spring
- Calling a RESTful service in the client
- Defining the error handler
- Using the error handler
到目前为止,我们已经创建了一个 REST API 并在 SoapUI、Postman 或 JUnit 测试等第三方工具中使用它.在某些情况下,您可能必须使用常规方法(服务或其他控制器方法)本身来使用 REST API,例如服务 API 中的支付 API 调用。当您在代码中调用第三方 API(例如 PayPal 或天气 API)时,它将很有用。在这种情况下,拥有一个 REST 客户端将有助于完成工作。
在这里,我们将讨论如何构建一个 REST 客户端以在我们的方法中使用另一个 REST API。在继续之前,我们将讨论一下 Spring 中的 RestTemplate
。
RestTemplate
是一个 Spring 类,用于使用来自的 REST API客户端通过HTTP。通过使用 RestTemplate
,我们也可以将 REST API 使用者保持在同一个应用程序中,因此我们不需要第三方应用程序或其他应用程序来使用我们的 API。 RestTemplate
可用于调用 GET
, POST
, PUT
、DELETE
和其他高级 HTTP 方法(OPTIONS
、
首先,我们将在 AppConfig
类中添加一个 RestTemplate
bean 配置。在下面的代码中,我们将看到如何配置 RestTemplate
bean:
在前面的代码中,我们已经提到了这个带有 @Configuration
注解的类来配置类中的所有 bean。我们还在这个类中引入了 RestTemplate
bean。通过在 AppConfig
类中配置 bean,我们告诉应用程序提到的 bean 可以在应用程序的任何地方使用。当应用程序启动时,它会自动初始化 bean 并准备好在任何需要的地方使用模板。
现在,我们可以通过在任何类中简单地使用 @Autowire
注释来使用 RestTemplate
。为了更好地理解,我们创建了一个名为 ClientController
的新类,并在该类中添加了一个简单的方法:
在前面的代码中,我们使用了 RestTemplate
并调用了 getForObject
方法来使用 API。默认情况下,我们使用 String.class
来保持我们的代码简单易懂。
当你调用这个API http://localhost:8080/client/test/
,你会得到如下结果:
在前面的过程中,我们在另一个 REST API 中使用了 RestTemplate
。在实时场景中,您可能会使用与调用第三方 REST API 相同的方法。
让我们在另一个方法中获取单个用户 API:
通过调用上述API,您将获得单个用户。为了调用这个 API,我们的 User
类应该被序列化,否则你可能会得到一个 unserialized object 错误。让我们通过实现 Serializable
并添加序列版本 ID 来序列化我们的 User
类。
序列化 User
类后,如下所示:
最后,我们可以在浏览器中调用http://localhost:8080/client/test/user
客户端API,得到如下结果:
为了便于理解,我们只使用了 GET
方法。但是,我们可以在 RESTPOST 方法和 add
参数id288564749" class="indexterm"> 消费者。
到目前为止,在我们的应用程序中,我们还没有定义 任何特定的错误处理程序来捕获错误并将其传送到正确的格式.通常当我们处理 REST API 中的意外情况时,它会自动抛出一个 HTTP 错误,例如 404
。 404
等错误会在浏览器中显式显示。这通常没问题;但是,无论事情是对还是错,我们都可能需要 JSON 格式的结果。
在这种情况下,将错误转换为 JSON 格式将是一个好主意。通过提供 JSON 格式,我们可以保持我们的应用程序干净和标准化。
在这里,我们将讨论如何管理错误并在出现问题时以 JSON 格式显示它们。让我们创建一个通用的错误处理程序类来管理我们所有的错误:
前面的类将充当我们应用程序中的常见错误处理程序。在 ErrorHandler
类中,我们使用 @ExceptionHandler< 创建了一个名为
handleException
的方法/code> 注释。此注解将使该方法接收应用程序中的所有异常。一旦我们得到异常,我们就可以根据异常的类型来管理要做什么。
在我们的代码中,我们只使用了两种情况来管理我们的异常:
- Missing parameter
- General error (everything else other than missing parameter)
如果我们在调用任何 REST API 时遗漏了一个参数,它将转到第一种情况 Parameter Missing
,否则它将转到 Generic错误
默认错误。我们简化了流程,使新用户可以理解。但是,我们可以在这个方法中添加更多的案例来管理更多的异常。
一旦我们完成了错误处理程序,我们将不得不在我们的应用程序中使用它。可以通过多种方式应用错误处理程序。扩展错误处理程序是使用它的最简单方法:
在前面的代码中,我们只是在 HomeController
类中扩展了 ErrorHandler
。通过这样做,我们将所有错误场景绑定到 ErrorHandler
以正确接收和处理。此外,我们创建了一个名为 testError
的测试方法来检查我们的错误处理程序。
为了调用这个API,我们需要传递item
作为参数;否则它将在应用程序中引发错误。由于我们已经定义了 ErrorController
类并扩展了 HomeController
类,缺少参数将带您进入前面提到的第一个场景.
只需在浏览器或任何 REST 客户端 (Postman/SoapUI) 中尝试以下 URL:http://localhost:8080/test/error
。
如果您尝试前面的端点,您将得到以下结果:
由于我们在错误处理程序中定义了 JSON 格式,如果任何 REST API 抛出异常,我们将得到 JSON 格式的错误。