概述
在上一课中,我们完成了构建对 REST API 的请求,以创建新的房源。终点就在眼前!
在本课中,我们将
- 完成我们的突变数据提取器方法,并创建一些新的房源
在数据提取器中连接点
我们的模式已完成,包含了我们使 突变正常工作所需的所有类型,并且ListingService
已更新,包含一个新方法。现在我们只需要连接数据提取器中的最后一个部分!
首先,确保我们的生成代码考虑了这些新的模式类型,然后重启服务器。
接下来,我们将回到我们的 ListingDataFetcher
文件。还记得我们在类的 featuredListings
方法上使用的 @DgsQuery
注解吗?我们还可以使用另一个注解,将其标记为负责一个 突变:@DgsMutation
!
让我们将其导入文件顶部。
import com.netflix.graphql.dgs.DgsMutation;
现在我们可以添加此注解,并在其下方编写新方法。我们将给它与我们 Mutation
类型的 字段相同的名称:createListing
。
public class ListingDataFetcher {@DgsMutationpublic void createListing() {}// other methods}
如果使用 IntelliJ 作为 IDE,你会立即看到方法名称下方出现黄色波浪线。将鼠标悬停在上面,我们会看到一条消息,鼓励我们使用 @InputArgument
注解,并添加 input
参数,模式 字段期望。
@DgsMutationpublic void createListing(@InputArgument CreateListingInput input) {}
我们尚未定义 CreateListingInput
Java 类,我们可以将其用作 input
的数据类型,但幸运的是,DGS 帮我们解决了这个问题!更新模式并重启服务器后,我们应该会在生成的代码文件夹中看到一个专门为此目的而创建的新类:CreateListingInput
!
提示:如果你没有看到生成的 CreateListingInput
类,请尝试重启服务器。
我们可以将其从生成的文件夹导入以完成注解。
// other importsimport com.example.listings.generated.types.CreateListingInput;// other annotations@DgsMutationpublic void createListing(@InputArgument CreateListingInput input) {}
我们还会发现,现在可以为我们的 createListing
方法分配适当的返回值类型,因为生成的代码文件夹现在也包含一个 CreateListingPayload
类。
// other importsimport com.example.listings.generated.types.CreateListingInput;import com.example.listings.generated.types.CreateListingResponse;// other annotations@DgsMutationpublic CreateListingResponse createListing(@InputArgument CreateListingInput input) {}
准备响应主体
我们期望我们的方法返回 CreateListingResponse
的一个实例,因此让我们创建一个新的对象,我们可以在调用成功或失败时设置它。
CreateListingResponse response = new CreateListingResponse();
在此之后,我们将创建一个新的 try/catch
块,然后返回 response
。
CreateListingResponse response = new CreateListingResponse();try {// happy path} catch (Exception e) {// sad path}return response;
在 try
中,如果一切按预期进行,我们将向响应附加属性。我们希望使用所有传递到此方法作为 input
的属性,因此我们将直接将 input
传递给 ListingService
类的 createListingRequest
方法。我们将捕获端点返回的最新创建的房源,作为 ListingModel
类型,称为 createdListing
。然后,我们将设置 response
上的一些属性,以显示房源已按预期创建。
try {ListingModel createdListing = listingService.createListingRequest(input);response.setListing(createdListing);response.setCode(200);response.setMessage("success");response.setSuccess(true);} catch (Exception e) {// sad path}
处理悲观路径
如果我们的端点调用因任何原因失败,我们希望能够控制返回给客户端的内容。在 catch
块中,我们可以考虑任何抛出的异常。我们将设置异常消息,以及其他属性 code
和 success
,在返回的 response
对象上。
try {// try block logic} catch (Exception e) {response.setListing(null);response.setCode(500);response.setMessage(e.getMessage());response.setSuccess(false);}
运行一个简单的变异
我们将重启服务器以确保所有更改都已应用。
在Explorer 中,填写以下 操作:
mutation CreateListing($input: CreateListingInput!) {createListing(input: $input) {codesuccessmessagelisting {titledescriptioncostPerNightamenities {namecategory}}}}
并将以下内容添加到 变量 面板中。
{"input": {"title": "Mars' top destination","description": "A really cool place to stay","costPerNight": 44.0,"amenities": ["am-1", "am-2"],"numOfBeds": 2}}
当我们运行 操作 时,我们会看到这个 变异 按预期工作!我们可以清楚地看到我们为 code
、success
和 message
设置的值 - 不用说我们刚刚创建的新列表的详细信息!
太棒了,你做到了!
旅程的终点
你已经构建了一个 GraphQL API!你拥有一个正在运行的 GraphQL 服务器,充满了星际列表,它使用 REST API 作为 数据源。你已经编写了查询和 变异,并在此过程中学习了一些常见的 GraphQL 约定。你已经探索了如何在你的架构设计中使用 GraphQL 参数、变量 和输入类型。花点时间庆祝一下;你学到了很多东西!
但旅程并没有结束!当你准备好让你的 GraphQL API 更进一步 时,跳入本系列中的下一门课程:与 Java 和 DGS 联合。
感谢你加入本课程;我们希望在下一门课程中见到你!
分享你关于本课的问题和评论
本课程目前正在
你需要一个 GitHub 帐户才能在下面发帖。没有吗? 改为在我们的 Odyssey 论坛发帖。