

# 调用私有 API
<a name="apigateway-private-api-test-invoke-url"></a>

只能使用 VPC 端点从 VPC 内部调用私有 API。私有 API 必须具有允许特定 VPC 和 VPC 端点调用 API 的资源策略。

如果您在不使用自定义域名或私有 DNS 名称的情况下调用私有 API，并且您的 API 或域名使用以 `SecurityPolicy_` 开头的安全策略，则您必须将端点访问模式设置为 `BASIC`。有关更多信息，请参阅 [端点访问模式](apigateway-security-policies.md#apigateway-security-policies-endpoint-access-mode)。

## 使用自定义域名调用私有 API
<a name="apigateway-private-custom-domains-provider-invoke"></a>

要使用自定义域名调用私有 API，您的 VPC 端点需要与自定义域名建立域名访问关联，并且自定义域名需要允许访问，以便 VPC 端点进行调用。有关更多信息，请参阅 [API Gateway 中私有 API 的自定义域名](apigateway-private-custom-domains.md)。

对于在 VPC 中调用私有自定义域名，在您的 Amazon Web Services 账户中与在其他 Amazon Web Services 账户中效果相同。

### 使用您的自定义域名
<a name="apigateway-private-custom-domains-invoke-1"></a>

在您的 VPC 内，您可以使用自定义域名调用 API。以下 curl 命令示例用于调用私有自定义域名：

```
curl https://private.example.com
```

### 使用端点特定的私有 DNS 主机名
<a name="apigateway-private-custom-domains-invoke-2"></a>

您可以使用自定义域名和端点特定的私有 DNS 主机名调用 API。

```
curl https://{{private-dns-hostname}}.execute-api.{{region}}.vpce.amazonaws.com/{{basepath}} -H 'Host:{{custom-domain-name}}'
```

以下示例是一个 curl 命令，它使用端点特定的私有 DNS 主机名调用自定义域名：

```
curl https://vpce-123456-abc000.execute-api.us-east-2.vpce.amazonaws.com/test -H 'Host:private.example.com'
```

## 调用私有 API 而不使用自定义域名
<a name="apigateway-private-api-invoke-without-custom-domain-name"></a>

要调用私有 API 而不使用自定义域名，您需要标识 API 的 DNS 名称。以下步骤将演示如何查找您的 DNS 名称。

------
#### [ Amazon Web Services 管理控制台 ]

**查找 DNS 名称**

1. 登录到 Amazon Web Services 管理控制台并打开 Amazon VPC 控制台，网址：[https://console.aws.amazon.com/vpc/](https://console.amazonaws.cn/vpc/)。

1. 在主导航窗格中，选择**端点**，然后为 API Gateway 选择接口 VPC 端点。

1. 在**详细信息**窗格中，您将看到 **DNS 名称**字段中有五个值。前三个值是您的 API 的公有 DNS 名称。另外两个值则是 API 的私有 DNS 名称。

------
#### [ Amazon CLI ]

使用以下 [describe-vpc-endpoints](https://docs.amazonaws.cn/cli/latest/reference/ec2/describe-vpc-endpoints.html) 命令列出您的 DNS 值。

```
aws ec2 describe-vpc-endpoints --vpc-endpoint-ids vpce-01234567abcdef012
```

前三个值是您的 API 的公有 DNS 名称。另外两个值则是 API 的私有 DNS 名称。

------

### 使用 Route53 别名调用私有 API
<a name="apigateway-private-api-route53-alias"></a>

您可以将 VPC 端点与私有 API 关联或取消关联。有关更多信息，请参阅 [（可选）将 VPC 端点与私有 API 关联或取消关联](apigateway-private-api-create.md#associate-private-api-with-vpc-endpoint)。

将 VPC 端点与私有 API 关联后，您可以使用以下基本 URL 来调用 API：

```
https://{{{rest-api-id}}}-{{{vpce-id}}}.execute-api.{{{region}}}.amazonaws.com/{{{stage}}}
```

例如，如果您为 `test` 阶段设置了 `GET /pets` 方法，并且 REST API ID 为 `01234567ab`，VPC 端点 ID 为 `vpce-01234567abcdef012`，区域为 `us-west-2`，则可以按以下方式调用您的 API：

```
curl -v https://01234567ab-vpce-01234567abcdef012.execute-api.us-west-2.amazonaws.com/test/pets
```

### 使用私有 DNS 名称调用私有 API
<a name="w2aac15c20c17c17b9b9"></a>

如果您已启用了私有 DNS，则可以使用以下私有 DNS 名称访问私有 API：

```
{{{restapi-id}}}.execute-api.{{{region}}}.amazonaws.com
```

用于调用 API 的基本 URL 采用以下格式：

```
https://{{{restapi-id}}}.execute-api.{{{region}}}.amazonaws.com/{{{stage}}}
```

例如，如果您为 `test` 阶段设置了 `GET /pets` 方法，并且 REST API ID 为 `01234567ab`，区域为 `us-west-2`，则可以通过在浏览器中输入以下 URL 来调用私有 API：

```
https://01234567ab.execute-api.us-west-2.amazonaws.com/test/pets
```

或者，您可以使用以下 cURL 命令来调用私有 API：

```
curl -X GET https://01234567ab.execute-api.us-west-2.amazonaws.com/test/pets 
```

**警告**  
如果您为 VPC 端点启用私有 DNS，您将无法访问公有 API 的默认端点。有关更多信息，请参阅[为何无法从 API Gateway VPC 端点连接到我的公有 API？](https://repost.aws/knowledge-center/api-gateway-vpc-connections)

### 使用 Amazon Direct Connect 调用私有 API
<a name="w2aac15c20c17c17b9c11"></a>

您可以使用 Amazon Direct Connect 建立从本地网络到 Amazon VPC 的专用私有连接，并使用公有 DNS 名称通过该连接访问私有 API 端点。

您还可以使用私有 DNS 名称从本地网络访问您的私有 API，方法是设置 Amazon Route 53 Resolver 入站端点并从远程网络转发所有私有 DNS 的 DNS 查询。有关更多信息，请参阅 *Amazon Route 53 开发人员指南*中的[将入站 DNS 查询转发到您的 VPC](https://docs.amazonaws.cn/Route53/latest/DeveloperGuide/resolver-forwarding-inbound-queries.html)。

### 使用特定于端点的公有 DNS 主机名调用私有 API
<a name="apigateway-private-api-public-dns"></a>

您可以使用特定于端点的 DNS 主机名访问您的私有 API。这些是包含您的私有 API 的 VPC 端点 ID 或 API ID 的公有 DNS 主机名。

生成的基本 URL 采用以下格式：

```
https://{{{public-dns-hostname}}}.execute-api.{{{region}}}.vpce.amazonaws.com/{{{stage}}}
```

例如，如果您为 `test` 阶段设置 `GET /pets` 方法，并且 REST API ID 为 `abc1234`，其公有 DNS 主机名为 `vpce-def-01234567`，区域为 `us-west-2`，则可以通过在 cURL 命令中使用 `Host` 标头，使用 VPCe ID 调用私有 API：

```
curl -v https://vpce-def-01234567.execute-api.us-west-2.vpce.amazonaws.com/test/pets -H 'Host: abc1234.execute-api.us-west-2.amazonaws.com'
```

或者，您可以在 cURL 命令中使用 `x-apigw-api-id` 标头，以下面的格式通过 API ID 调用私有 API：

```
curl -v https://{{{public-dns-hostname}}}.execute-api.{{{region}}}.vpce.amazonaws.com/{{{stage}}} -H 'x-apigw-api-id:{{{api-id}}}'
```