

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# HTTPS 发布
<a name="http"></a>

客户端可使用 HTTP 1.0 或 1.1 协议向 REST API 发出请求来发布消息。有关 HTTP 请求使用的身份验证和端口映射，请参阅 [协议、端口映射和身份验证](protocols.md#protocol-mapping)。

**注意**  
HTTPS 不像 MQTT 那样支持 `clientId` 值。`clientId` 在使用 MQTT 时可用，但在使用 HTTPS 时不可用。

## HTTPS 消息 URL
<a name="httpurl"></a>

设备和客户端通过向特定于客户端的端点和特定于主题的 URL 发出 POST 请求来发布消息：

```
https://IoT_data_endpoint/topics/url_encoded_topic_name?qos=1
```
+  *IoT\$1data\$1endpoint*是[AWS IoT 设备数据端点](iot-connect-devices.md#iot-connect-device-endpoints)。您可以使用以下 AWS CLI 命令在 AWS IoT 控制台中的事物详细信息页面或客户端上找到终端节点：

  ```
  aws iot describe-endpoint --endpoint-type iot:Data-ATS
  ```

   该端点看起来应如下所示：`a3qjEXAMPLEffp-ats.iot.us-west-2.amazonaws.com`
+ *url\$1encoded\$1topic\$1name*是正在发送的消息的完整[主题名称](topics.md#topicnames)。

## HTTPS 消息代码示例
<a name="codeexample"></a>

以下是一些如何向 AWS IoT发送 HTTPS 消息的示例。

------
#### [ Python (port 8443) ]

```
import requests
import argparse

# define command-line parameters
parser = argparse.ArgumentParser(description="Send messages through an HTTPS connection.")
parser.add_argument('--endpoint', required=True, help="Your AWS IoT data custom endpoint, not including a port. " +
                                                      "Ex: \"abcdEXAMPLExyz-ats.iot.us-east-1.amazonaws.com\"")
parser.add_argument('--cert', required=True, help="File path to your client certificate, in PEM format.")
parser.add_argument('--key', required=True, help="File path to your private key, in PEM format.")
parser.add_argument('--topic', required=True, default="test/topic", help="Topic to publish messages to.")
parser.add_argument('--message', default="Hello World!", help="Message to publish. " +
                                                      "Specify empty string to publish nothing.")

# parse and load command-line parameter values
args = parser.parse_args()

# create and format values for HTTPS request
publish_url = 'https://' + args.endpoint + ':8443/topics/' + args.topic + '?qos=1'
publish_msg = args.message.encode('utf-8')

# make request
publish = requests.request('POST',
            publish_url,
            data=publish_msg,
            cert=[args.cert, args.key])

# print results
print("Response status: ", str(publish.status_code))
if publish.status_code == 200:
        print("Response body:", publish.text)
```

------
#### [ Python (port 443) ]

```
import requests
import http.client
import json
import ssl

ssl_context = ssl.SSLContext(protocol=ssl.PROTOCOL_TLS_CLIENT)
ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2

# note the use of ALPN
ssl_context.set_alpn_protocols(["x-amzn-http-ca"])
ssl_context.load_verify_locations(cafile="./<root_certificate>")

# update the certificate and the AWS endpoint
ssl_context.load_cert_chain("./<certificate_in_PEM_Format>", "<private_key_in_PEM_format>")
connection = http.client.HTTPSConnection('<the ats IoT endpoint>', 443, context=ssl_context)
message = {'data': 'Hello, I'm using TLS Client authentication!'}
json_data = json.dumps(message)
connection.request('POST', '/topics/device%2Fmessage?qos=1', json_data)

# make request
response = connection.getresponse()

# print results
print(response.read().decode())
```

------
#### [ CURL ]

您可以使用来自客户端或设备的 [curl](https://curl.haxx.se) 向 AWS IoT发送消息。

**使用 curl 从 AWS IoT 客户端设备发送消息**

1. 检查 **curl** 版本。

   1. 在客户端上，在命令提示符下运行此命令。

      **curl --help**

      在帮助文本中，查找 TLS 选项。您应看到 `--tlsv1.2` 选项。

   1. 如果您看到 `--tlsv1.2` 选项，请继续操作。

   1. 如果您没有看到 `--tlsv1.2` 选项或者收到 `command not found` 错误，则您可能需要先在客户端上更新或安装 curl，或者安装 `openssl`，然后再继续。

1. 在客户端上安装证书。

   复制您在 AWS IoT 控制台中注册客户端（事物）时创建的证书文件。请先确保客户端上有这三个证书文件，然后再继续。
   + CA 证书文件（此示例中为 *Amazon-root-CA-1.pem*）。
   + 客户端的证书文件（此示例中为 *device.pem.crt*）。
   + 客户端的私有密钥文件（此示例中为 *private.pem.key*）。

1. 创建 **curl** 命令行，并替换您的账户和系统的可替换值。

   ```
   curl --tlsv1.2 \
       --cacert Amazon-root-CA-1.pem \
       --cert device.pem.crt \
       --key private.pem.key \
       --request POST \
       --data "{ \"message\": \"Hello, world\" }" \
       "https://IoT_data_endpoint:8443/topics/topic?qos=1"
   ```  
--tlsv1.2  
使用 TLS 1.2（SSL）。  
--cacert *Amazon-root-CA-1.pem*  
用于验证对等方的 CA 证书的文件名和路径（如有必要）。  
--证书 *device.pem.crt*  
客户端的证书文件名和路径（如有必要）。  
--key *private.pem.key*  
客户端的私有密钥文件名和路径（如有必要）。  
--request POST  
HTTP 请求的类型（此示例中为 POST）。  
--数据 “” *\$1 \$1"message\$1": \$1"Hello, world\$1" \$1*  
要发布的 HTTP POST 数据。在此示例中，它是一个 JSON 字符串，其内部引号通过反斜杠字符 (\$1) 进行转义。  
“https: //: 8443/topics/？*IoT\$1data\$1endpoint**topic* qos=1"  
您的客户端 AWS IoT 设备数据端点的 URL，后面是 HTTPS 端口`:8443`，然后是关键字`/topics/`和主题名称`topic`，在本例中则是主题名称。指定服务质量作为查询参数 `?qos=1`。

1. 在 AWS IoT 控制台中打开 MQTT 测试客户端。

   按照中的说明进行操作[使用 MQTT 客户端查看 AWS IoT MQTT 消息](view-mqtt-messages.md)，将控制台配置为使用**curl**命令中*topic*使用的主题名称订阅消息，或者使用通配符主题筛选器。`#`

1. 测试命令。

   在 AWS IoT 控制台的测试客户端中监控主题时，请转到客户端并发出您在步骤 3 中创建的 curl 命令行。控制台中应显示客户端的消息。

------