

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

# 使用 适用于 PHP 的 Amazon SDK 版本 3 来针对自定义 Amazon CloudSearch 域请求签名
<a name="service_cloudsearch-custom-requests"></a>

可以在 适用于 PHP 的 Amazon SDK 支持的范围之外对 Amazon CloudSearch 域请求进行自定义。当您需要向受 IAM 身份验证保护的域发出自定义请求时，可以使用 SDK 的凭证提供程序和签署人对任何 [PSR-7 请求](https://docs.amazonaws.cn/aws-sdk-php/v3/api/class-Psr.Http.Message.RequestInterface.html)签名。

例如，如果您要按照 [Cloud Search 的入门指南](https://docs.amazonaws.cn/cloudsearch/latest/developerguide/getting-started.html)操作，并想在[第 3 步](https://docs.amazonaws.cn/cloudsearch/latest/developerguide/getting-started-search.html)中使用受 IAM 保护的域，则需要按以下方式签署并执行请求。

以下示例演示如何：
+ 使用 [SignatureV4](https://docs.amazonaws.cn/aws-sdk-php/v3/api/class-Aws.Signature.SignatureV4.html#_signRequest) 通过 Amazon 签名协议签署请求。

适用于 PHP 的 Amazon SDKGitHub[ 上提供了](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/php/example_code)的所有示例代码。

## 凭证
<a name="examplecredentials"></a>

运行示例代码之前，请配置您的 Amazon 凭证，如 [Amazon 使用 适用于 PHP 的 Amazon SDK 版本 3 进行身份验证](credentials.md) 中所述。然后导入 适用于 PHP 的 Amazon SDK，如 [安装 适用于 PHP 的 Amazon SDK 版本 3](getting-started_installation.md) 中所述。

## 签署 Amazon CloudSearch 域请求
<a name="sign-cslong-domain-request"></a>

 **导入**。

```
require './vendor/autoload.php';

use Aws\Credentials\CredentialProvider;
use Aws\Signature\SignatureV4;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7\Request;
```

 **示例代码** 

```
function searchDomain(
    $client,
    $domainName,
    $domainId,
    $domainRegion,
    $searchString
) {
    $domainPrefix = 'search-';
    $cloudSearchDomain = 'cloudsearch.amazonaws.com';
    $cloudSearchVersion = '2013-01-01';
    $searchPrefix = 'search?';

    // Specify the search to send.
    $request = new Request(
        'GET',
        "https://$domainPrefix$domainName-$domainId.$domainRegion." .
            "$cloudSearchDomain/$cloudSearchVersion/" .
            "$searchPrefix$searchString"
    );

    // Get default AWS account access credentials.
    $credentials = call_user_func(CredentialProvider::defaultProvider())->wait();

    // Sign the search request with the credentials.
    $signer = new SignatureV4('cloudsearch', $domainRegion);
    $request = $signer->signRequest($request, $credentials);

    // Send the signed search request.
    $response = $client->send($request);

    // Report the search results, if any.
    $results = json_decode($response->getBody());

    $message = '';

    if ($results->hits->found > 0) {
        $message .= 'Search results:' . "\n";

        foreach ($results->hits->hit as $hit) {
            $message .= $hit->fields->title . "\n";
        }
    } else {
        $message .= 'No search results.';
    }

    return $message;
}

function searchADomain()
{
    $domainName = 'my-search-domain';
    $domainId = '7kbitd6nyiglhdtmssxEXAMPLE';
    $domainRegion = 'us-east-1';
    $searchString = 'q=star+wars&return=title';
    $client = new Client();

    echo searchDomain(
        $client,
        $domainName,
        $domainId,
        $domainRegion,
        $searchString
    );
}

// Uncomment the following line to run this code in an AWS account.
// searchADomain();
```