

# 示例：Amazon 签名版本 4 中的签名计算
<a name="sig-v4-examples-using-sdks"></a>

**Topics**
+ [使用 Java 的签名计算示例（Amazon 签名版本 4）](#sig-v4-examples-using-sdk-java)
+ [使用 C\# 的签名计算示例（Amazon 签名版本 4）](#sig-v4-examples-using-sdk-dotnet)

 对于经过身份验证的请求，除非您使用 Amazon SDK，否则您必须编写代码来计算在请求中提供身份验证信息的签名。Amazon 签名版本 4 中的签名计算（请参阅[对请求进行身份验证（Amazon 签名版本 4）](sig-v4-authenticating-requests.md)）可能是一项复杂的任务，我们建议您尽可能使用 Amazon SDK。

 本节提供用 Java 和 C\# 编写的签名计算示例。代码示例发送以下请求，并使用 HTTP Authorization 标头来提供身份验证信息：
+ **PUT 对象**：单独的示例说明了一次性上传完整有效载荷和分块上传有效载荷。有关使用 Authorization 标头进行身份验证的信息，请参阅[对请求进行身份验证：使用 Authorization 标头（Amazon 签名版本 4）](sigv4-auth-using-authorization-header.md)。
+ **GET 对象**：此示例生成预签名 URL 以获取对象。查询参数提供签名和其它身份验证信息。用户可以在其浏览器中粘贴预签名 URL 以检索对象，也可以使用该 URL 创建可点击的链接。有关使用查询参数进行身份验证的信息，请参阅[对请求进行身份验证：使用查询参数（Amazon 签名版本 4）](sigv4-query-string-auth.md)。

本节的其余部分介绍 Java 和 C\# 中的示例。这些主题包括用于下载和执行示例的说明。

## 使用 Java 的签名计算示例（Amazon 签名版本 4）
<a name="sig-v4-examples-using-sdk-java"></a>

显示签名计算的 Java 示例可以从 [https://docs.aws.amazon.com/AmazonS3/latest/API/samples/AWSS3SigV4JavaSamples.zip](samples/AWSS3SigV4JavaSamples.zip) 下载。请注意，这些示例使用适用于 Java 的 Amazon SDK v1，我们建议对新的应用程序使用[适用于 Java 的 Amazon SDK v2](https://docs.amazonaws.cn/sdk-for-java/latest/developer-guide/home.html)。在 `RunAllSamples.java` 中，`main()` 函数执行示例请求，以创建对象、检索对象以及为该对象创建预签名 URL。该示例根据代码中提供的文本字符串创建一个对象：

```
PutS3ObjectSample.putS3Object(bucketName, regionName, awsAccessKey, awsSecretKey); 
GetS3ObjectSample.getS3Object(bucketName, regionName, awsAccessKey, awsSecretKey); 
PresignedUrlSample.getPresignedUrlToS3Object(bucketName, regionName, awsAccessKey, awsSecretKey); 
PutS3ObjectChunkedSample.putS3ObjectChunked(bucketName, regionName, awsAccessKey, awsSecretKey);
```

**在基于 Linux 的计算机上测试示例**

以下说明适用于 Linux 操作系统。

1. 在终端中，导航到包含 `AWSS3SigV4JavaSamples.zip` 的目录。

1. 将 .zip 文件解压缩。

1. 在文本编辑器中，打开 `./com/amazonaws/services/s3/samples/RunAllSamples.java`文件。使用以下信息更新代码：

    
   + 可以在其中创建新对象的存储桶的名称。

      
**注意**  
这些示例使用虚拟托管类型的请求来访问存储桶。为避免潜在的错误，请确保存储桶名称符合在《Amazon Simple Storage Service 用户指南》**的[存储桶限制和局限性](https://docs.amazonaws.cn/AmazonS3/latest/userguide/BucketRestrictions.html)中所述的存储桶命名规则。
   + 存储桶所在的 Amazon Web Services 区域。

      如果存储桶位于美国东部（弗吉尼亚州北部）区域，请使用 us-east-1 指定区域。有关其它 Amazon Web Services 区域的列表，请访问《Amazon Web Services 一般参考》**中的 [Amazon Simple Storage Service（S3）](https://docs.amazonaws.cn/general/latest/gr/rande.html#s3_region)。

1. 编译源代码并将编译后的类存储到 `bin/` 目录中。

   ```
   javac -d bin -source 6 -verbose com
   ```

1. 将目录更改为 `bin/`，然后运行 `RunAllSamples`。

    

   ```
   java com.amazonaws.services.s3.sample.RunAllSamples
   ```

   该代码运行 `main()` 中的所有方法。对于每个请求，输出都将显示规范请求、待签字符串和签名。



## 使用 C\# 的签名计算示例（Amazon 签名版本 4）
<a name="sig-v4-examples-using-sdk-dotnet"></a>

 显示签名计算的 C\# 示例可从 [https://docs.aws.amazon.com/AmazonS3/latest/API/samples/AmazonS3SigV4\_Samples\_CSharp.zip](samples/AmazonS3SigV4_Samples_CSharp.zip) 下载。请注意，这些示例使用适用于 .NET 的 Amazon SDK v1，我们建议对新的应用程序使用[适用于 .NET 的 Amazon SDK v3](https://docs.amazonaws.cn/sdk-for-net/latest/developer-guide/home.html)。在 `Program.cs` 中，`main()` 函数执行示例请求，以创建对象、检索对象以及为该对象创建预签名 URL。用于签名计算的代码位于 `\Signers` 文件夹中。

```
PutS3ObjectSample.Run(awsRegion, bucketName, "MySampleFile.txt");

Console.WriteLine("\n\n************************************************");
PutS3ObjectChunkedSample.Run(awsRegion, bucketName, "MySampleFileChunked.txt");

Console.WriteLine("\n\n************************************************");
GetS3ObjectSample.Run(awsRegion, bucketName, "MySampleFile.txt");

Console.WriteLine("\n\n************************************************");
PresignedUrlSample.Run(awsRegion, bucketName, "MySampleFile.txt");
```

**使用 Microsoft Visual Studio 2010 或更高版本测试示例**

1. 将 .zip 文件解压缩。

1.  启动 Visual Studio，然后打开 .sln 文件。

1. 使用有效的安全凭证更新 App.config 文件。

1. 按如下所示更新代码：

    
   +  在 `Program.cs` 中，提供存储桶名称和存储桶所在的 Amazon Web Services 区域。此示例在此存储桶中创建对象。

1. 运行该代码。

1.  要验证对象是否已创建，请复制程序创建的预签名 URL，然后将其粘贴到浏览器窗口中。