13. 总结
10m

概述

在上一课中,我们完成了构建对 REST API 的请求,以创建新的房源。终点就在眼前!

在本课中,我们将

  • 完成我们的数据提取器方法,并创建一些新的房源

在数据提取器中连接点

我们的模式已完成,包含了我们使 正常工作所需的所有类型,并且ListingService已更新,包含一个新方法。现在我们只需要连接数据提取器中的最后一个部分!

首先,确保我们的生成代码考虑了这些新的模式类型,然后重启服务器。

任务!

接下来,我们将回到我们的 ListingDataFetcher文件。还记得我们在类的 featuredListings方法上使用的 @DgsQuery注解吗?我们还可以使用另一个注解,将其标记为负责一个 @DgsMutation

让我们将其导入文件顶部。

datafetchers/ListingDataFetcher
import com.netflix.graphql.dgs.DgsMutation;

现在我们可以添加此注解,并在其下方编写新方法。我们将给它与我们 Mutation类型的 相同的名称:createListing

public class ListingDataFetcher {
@DgsMutation
public void createListing() {}
// other methods
}

如果使用 IntelliJ 作为 IDE,你会立即看到方法名称下方出现黄色波浪线。将鼠标悬停在上面,我们会看到一条消息,鼓励我们使用 @InputArgument注解,并添加 input ,模式 期望。

@DgsMutation
public void createListing(@InputArgument CreateListingInput input) {
}

我们尚未定义 CreateListingInput Java 类,我们可以将其用作 input的数据类型,但幸运的是,DGS 帮我们解决了这个问题!更新模式并重启服务器后,我们应该会在生成的代码文件夹中看到一个专门为此目的而创建的新类:CreateListingInput

提示:如果你没有看到生成的 CreateListingInput类,请尝试重启服务器。

我们可以将其从生成的文件夹导入以完成注解。

// other imports
import com.example.listings.generated.types.CreateListingInput;
// other annotations
@DgsMutation
public void createListing(@InputArgument CreateListingInput input) {
}

我们还会发现,现在可以为我们的 createListing方法分配适当的返回值类型,因为生成的代码文件夹现在也包含一个 CreateListingPayload类。

datafetchers/ListingDataFetcher
// other imports
import com.example.listings.generated.types.CreateListingInput;
import com.example.listings.generated.types.CreateListingResponse;
// other annotations
@DgsMutation
public 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块中,我们可以考虑任何抛出的异常。我们将设置异常消息,以及其他属性 codesuccess,在返回的 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) {
code
success
message
listing {
title
description
costPerNight
amenities {
name
category
}
}
}
}

并将以下内容添加到 变量 面板中。

{
"input": {
"title": "Mars' top destination",
"description": "A really cool place to stay",
"costPerNight": 44.0,
"amenities": ["am-1", "am-2"],
"numOfBeds": 2
}
}

当我们运行 时,我们会看到这个 按预期工作!我们可以清楚地看到我们为 codesuccessmessage 设置的值 - 不用说我们刚刚创建的新列表的详细信息!

太棒了,你做到了!

旅程的终点

任务!

你已经构建了一个 API!你拥有一个正在运行的 ,充满了星际列表,它使用 REST API 作为 。你已经编写了查询和 ,并在此过程中学习了一些常见的 GraphQL 约定。你已经探索了如何在你的架构设计中使用 GraphQL 和输入类型。花点时间庆祝一下;你学到了很多东西!

但旅程并没有结束!当你准备好让你的 API 更进一步 时,跳入本系列中的下一门课程:与 Java 和 DGS 联合

感谢你加入本课程;我们希望在下一门课程中见到你!

上一页

分享你关于本课的问题和评论

本课程目前正在

测试版
.你的反馈帮助我们改进!如果你卡住了或感到困惑,请告诉我们,我们会帮助你。所有评论都是公开的,必须遵守 Apollo 行为准则。请注意,已解决或已处理的评论可能会被删除。

你需要一个 GitHub 帐户才能在下面发帖。没有吗? 改为在我们的 Odyssey 论坛发帖。