

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 步驟 1：確保您的端點已就緒可處理 Amazon SNS 訊息
<a name="SendMessageToHttp.prepare"></a>

在您訂閱您的 HTTP 或 HTTPS 端點到主題之前，您必須確保 HTTP 或 HTTPS 端點擁有處理 HTTP POST 請求 (Amazon SNS 用來傳送訂閱確認和通知訊息) 的能力。通常，這表示建立和部署處理來自 Amazon SNS 之 HTTP 請求的 Web 應用程式 (例如，如果您的端點主機執行 Linux 搭配 Apache 和 Tomcat)，則為 Java servlet。在您訂閱 HTTP 端點時，Amazon SNS 會傳送確認請求至該端點。您的端點必須在您建立訂閱時準備好接收和處理此請求，因為 Amazon SNS 會在那時候傳送此請求。Amazon SNS 不會傳送通知至端點，除非您已確認訂閱。一旦您確認訂閱，Amazon SNS 將在訂閱的主題上執行發佈動作時，傳送通知到端點。

**設定您的端點以處理訂閱確認和通知訊息**

1. 您的程式碼應會讀取 Amazon SNS 傳送至您端點的 HTTP POST 請求的 HTTP 標頭。您的程式碼應會尋找標頭欄位 `x-amz-sns-message-type`，此欄位告訴您 Amazon SNS 所傳送給您的訊息類型。透過查看標頭，您可以判定訊息類型，而無須剖析 HTTP 訊息內文。有兩種類型您需要處理：`SubscriptionConfirmation` 和 `Notification`。`UnsubscribeConfirmation` 訊息唯有從主題刪除訂閱時才使用。

   如需有關 HTTP 標頭的詳細資訊，請參閱 [HTTP/HTTPS 標頭](http-header.md)。以下 HTTP POST 請求是訂閱確認訊息的範例。

   ```
   POST / HTTP/1.1
       x-amz-sns-message-type: SubscriptionConfirmation
       x-amz-sns-message-id: 165545c9-2a5c-472c-8df2-7ff2be2b3b1b
       x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
       Content-Length: 1336
       Content-Type: text/plain; charset=UTF-8
       Host: example.com
       Connection: Keep-Alive
       User-Agent: Amazon Simple Notification Service Agent
       
   {
     "Type" : "SubscriptionConfirmation",
     "MessageId" : "165545c9-2a5c-472c-8df2-7ff2be2b3b1b",
     "Token" : "2336412f37f...",
     "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
     "Message" : "You have chosen to subscribe to the topic arn:aws:sns:us-west-2:123456789012:MyTopic.\nTo confirm the subscription, visit the SubscribeURL included in this message.",
     "SubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-west-2:123456789012:MyTopic&Token=2336412f37...",
     "Timestamp" : "2012-04-26T20:45:04.751Z",
     "SignatureVersion" : "1",
     "Signature" : "EXAMPLEpH+...",
     "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem"
   }
   ```

1. 您的程式碼應該剖析 HTTP POST 請求和內文類型文字/純文字，和內文中的 JSON 文件，以讀取組成 Amazon SNS 訊息的名稱值組。使用 JSON 剖析器，處理將逸出表示法的控制字元轉換回其 ASCII 字元值 (例如，將 \$1n 轉換為新行字元)。您可以使用現有的 JSON 剖析器，例如 [Jackson JSON Processor](https://github.com/FasterXML/jackson) 或者您自己撰寫。為傳送主旨和訊息欄位中的文字做為有效的 JSON，Amazon SNS 必須轉換一些控制字元為可包含在 JSON 文件中的逸出表示法。當您接收傳送至您端點的 POST 請求內文中的 JSON 文件時，如果您想要確切呈現發佈至主題的原始主旨和訊息，您必須將逸出的字元轉換回其原始字元值。如果您想要驗證通知的簽章，這很重要，因為簽章使用其原始形式的訊息和主旨做為要簽署之字串的一部分。

1. 您的程式碼應該驗證 Amazon SNS 所傳送之通知、訂閱確認或取消訂閱確認訊息的真偽。使用包含在 Amazon SNS 訊息中的資訊，您的端點可以重新建立簽章，以便您能夠透過比對簽章與 Amazon SNS 隨訊息傳送的簽章，來驗證訊息的內容。如需有關驗證訊息之簽章的詳細資訊，請參閱 [驗證 Amazon SNS 訊息的簽章](sns-verify-signature-of-message.md)。

1. 根據標頭欄位 `x-amz-sns-message-type` 所指定的類型，您的程式碼應該讀取 HTTP 請求內文中所包含的 JSON 文件並處理訊息。以下是處理兩個主要類型的訊息的準則：  
**SubscriptionConfirmation**  
讀取 `SubscribeURL` 的值並造訪該 URL。若要確認訂閱並開始在端點接收通知，您必須造訪 `SubscribeURL`URL (例如，透過傳送 HTTP GET 請求至 URL)。請查看上一個步驟中的範例 HTTP 請求，以得知 `SubscribeURL` 看起來像什麼。如需有關 `SubscriptionConfirmation` 訊息之格式的詳細資訊，請參閱 [HTTP/HTTPS 訂閱確認 JSON 格式](http-subscription-confirmation-json.md)。當您造訪 URL，您將得到類似下列 XML 文件的回應。文件會傳回 `ConfirmSubscriptionResult` 元素內端點的訂閱 ARN。  

   ```
   <ConfirmSubscriptionResponse xmlns="http://sns.amazonaws.com/doc/2010-03-31/">
      <ConfirmSubscriptionResult>
         <SubscriptionArn>arn:aws:sns:us-west-2:123456789012:MyTopic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55</SubscriptionArn>
      </ConfirmSubscriptionResult>
      <ResponseMetadata>
         <RequestId>075ecce8-8dac-11e1-bf80-f781d96e9307</RequestId>
      </ResponseMetadata>
   </ConfirmSubscriptionResponse>
   ```
做為造訪 `SubscribeURL` 的替代方案，您可以使用 [ConfirmSubscription](https://docs.aws.amazon.com/sns/latest/api/API_ConfirmSubscription.html) 動作且 `Token` 設定為其 `SubscriptionConfirmation` 訊息中的對應值，來確認訂閱。如果您想要僅允許主題擁有者和訂閱擁有者可以取消訂閱端點，您使用 AWS 簽章呼叫 `ConfirmSubscription` 動作。  
**Notification**  
讀取 `Subject` 和 `Message` 的值來取得已發佈至主題的通知資訊。  
如需有關 `Notification` 訊息之格式的詳細資訊，請參閱 [HTTP/HTTPS 標頭](http-header.md)。以下 HTTP POST 請求是傳送至端點 example.com 之通知訊息的範例。  

   ```
   POST / HTTP/1.1
       x-amz-sns-message-type: Notification
       x-amz-sns-message-id: 22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324
       x-amz-sns-topic-arn: arn:aws:sns:us-west-2:123456789012:MyTopic
       x-amz-sns-subscription-arn: arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96
       Content-Length: 773
       Content-Type: text/plain; charset=UTF-8
       Host: example.com
       Connection: Keep-Alive
       User-Agent: Amazon Simple Notification Service Agent
       
   {
     "Type" : "Notification",
     "MessageId" : "22b80b92-fdea-4c2c-8f9d-bdfb0c7bf324",
     "TopicArn" : "arn:aws:sns:us-west-2:123456789012:MyTopic",
     "Subject" : "My First Message",
     "Message" : "Hello world!",
     "Timestamp" : "2012-05-02T00:54:06.655Z",
     "SignatureVersion" : "1",
     "Signature" : "EXAMPLEw6JRN...",
     "SigningCertURL" : "https://sns.us-west-2.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem",
     "UnsubscribeURL" : "https://sns.us-west-2.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-west-2:123456789012:MyTopic:c9135db0-26c4-47ec-8998-413945fb5a96"
   }
   ```

1. 確保您的端點從具適當狀態碼的 Amazon SNS 對應至 HTTP POST 訊息。連線會在大約 15 秒內逾時。如果您的端點未在連線逾時之前回應，或您的端點傳回 200–4*xx* 範圍以外的狀態碼，Amazon SNS 會將訊息交付視為失敗嘗試。

1. 確保您的程式碼可以處理來自 Amazon SNS 的訊息傳遞重試。如果 Amazon SNS 未從您的端點收到成功回應，它會再次嘗試傳遞訊息。這會套用到所有訊息，包括訂閱確認訊息。根據預設，如果初始的訊息傳遞失敗，Amazon SNS 最多嘗試重試三次，各次失敗的重試之間的延遲設定在 20 秒。
**注意**  
訊息請求會在大約 15 秒後逾時。這表示如果訊息傳遞失敗是因為逾時所導致，Amazon SNS 會在之前的傳遞重試後大約 35 秒進行重試。您可以為端點設定不同的傳遞政策。

   Amazon SNS 使用 `x-amz-sns-message-id` 標頭欄位對發布到 Amazon SNS 主題的每則訊息進行唯一識別。透過比較您已處理傳入之訊息的 ID，您可以判斷訊息是否為重試的嘗試。

1. 如果您將訂閱 HTTPS 端點，請確保您的端點具有來自信任的憑證授權機構 (CA) 的伺服器憑證。Amazon SNS 將僅傳送訊息至具有 Amazon SNS 所信任之 CA 簽署的伺服器憑證的 HTTPS 端點。

1. 部署您所建立以接收 Amazon SNS 訊息的程式碼。當您訂閱端點時，端點必須就緒以至少接收訂閱確認訊息。