创建和更新客户端

创建客户端

您可以使用 buyers.clients.create 方法创建代表您的某个客户端的 Client

您可以使用 Client 资源执行以下操作:

  • 在与发布商协商时提及客户。
  • 为客户订阅竞价包。
  • 管理客户对 Authorized Buyers 市场界面的访问权限。

以下示例演示了如何使用 create 方法创建新的 Client

REST

请求

POST https://authorizedbuyersmarketplace.googleapis.com/v1/buyers/12345678/clients?alt=json
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json
{
 "displayName": "Demo Approver 2",
 "role": "CLIENT_DEAL_APPROVER",
 "sellerVisible": false
}

响应

{
 "name": "buyers/12345678/clients/873721984",
 "role": "CLIENT_DEAL_APPROVER",
 "state": "ACTIVE",
 "displayName": "Demo Approver 2"
}

C#

/* Copyright 2021 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

using Google.Apis.AuthorizedBuyersMarketplace.v1;
using Google.Apis.AuthorizedBuyersMarketplace.v1.Data;
using Mono.Options;

using System;
using System.Collections.Generic;

namespace Google.Apis.AuthorizedBuyersMarketplace.Examples.v1.Buyers.Clients
{
    /// <summary>
    /// Creates a client for the given buyer account ID.
    /// </summary>
    public class CreateClients : ExampleBase
    {
        private AuthorizedBuyersMarketplaceService mkService;

        /// <summary>
        /// Constructor.
        /// </summary>
        public CreateClients()
        {
            mkService = Utilities.GetAuthorizedBuyersMarketplaceService();
        }

        /// <summary>
        /// Returns a description about the code example.
        /// </summary>
        public override string Description
        {
            get => "This code example creates a client for the given buyer account ID.";
        }

        /// <summary>
        /// Parse specified arguments.
        /// </summary>
        protected override Dictionary<string, object> ParseArguments(List<string> exampleArgs) {
            string[] requiredOptions = new string[] {"account_id"};
            bool showHelp = false;

            string accountId = null;
            string displayName = null;
            string partnerClientId = null;
            string role = null;
            string sellerVisible = null;

            OptionSet options = new OptionSet {
                "Creates a client for the given buyer account ID.",
                {
                    "h|help",
                    "Show help message and exit.",
                    h => showHelp = h != null
                },
                {
                    "a|account_id=",
                    ("[Required] The resource ID of the buyers resource under which the " +
                     "client is to be created. This will be used to construct the name used as " +
                     "a path parameter for the clients.create request."),
                    a => accountId = a
                },
                {
                    "d|display_name=",
                    ("The display name shown to publishers. Must be unique for clients without " +
                     "partnerClientId specified. The maximum length allowed is 255 characters. " +
                     "By default, this sample will specify a generated name."),
                    d => displayName = d
                },
                {
                    "p|partner_client_id=",
                    ("Arbitrary unique identifier provided by the buyer. This field can be used " +
                     "to associate a client with an identifier in the namespace of the buyer. If " +
                     "present, it must be unique across all the clients. By default, this sample " +
                     "will not specify a partnerClientId."),
                    p => partnerClientId = p
                },
                {
                    "r|role=",
                    ("The role assigned to the client, which determines its permissions. By " +
                     "default, this will be set to CLIENT_DEAL_VIEWER. For more details on how " +
                     "to interpret the different roles, see:" +
                     "https://developers.google.com/authorized-buyers/apis/marketplace/" +
                     "reference/rest/v1/buyers.clients#ClientRole"),
                    r => role = r
                },
                {
                    "s|seller_visible=",
                    ("A boolean value indicating whether the client will be visible to " +
                     "publishers. By default, this will be set to false."),
                    s => sellerVisible = s
                },
            };

            List<string> extras = options.Parse(exampleArgs);
            var parsedArgs = new Dictionary<string, object>();

            // Show help message.
            if (showHelp == true)
            {
                options.WriteOptionDescriptions(Console.Out);
                Environment.Exit(0);
            }
            // Set arguments.
            parsedArgs["account_id"] = accountId;
            parsedArgs["display_name"] = displayName ?? String.Format(
                "Test_Client_{0}",
                System.Guid.NewGuid());
            parsedArgs["partner_client_id"] = partnerClientId;
            parsedArgs["role"] = role ?? "CLIENT_DEAL_VIEWER";

            if (sellerVisible != null)
            {
                parsedArgs["seller_visible"] = Boolean.Parse(sellerVisible);
            } else
            {
                parsedArgs["seller_visible"] = false;
            }

            // Validate that options were set correctly.
            Utilities.ValidateOptions(options, parsedArgs, requiredOptions, extras);

            return parsedArgs;
        }

        /// <summary>
        /// Run the example.
        /// </summary>
        /// <param name="parsedArgs">Parsed arguments for the example.</param>
        protected override void Run(Dictionary<string, object> parsedArgs)
        {
            string accountId = (string) parsedArgs["account_id"];
            string parent = $"buyers/{accountId}";

            Client newClient = new Client()
            {
                DisplayName = (string) parsedArgs["display_name"],
                Role = (string) parsedArgs["role"],
                SellerVisible = (Boolean) parsedArgs["seller_visible"]
            };

            string partnerClientId = (string) parsedArgs["partner_client_id"];
            if (partnerClientId != null)
            {
                newClient.PartnerClientId = partnerClientId;
            }

            BuyersResource.ClientsResource.CreateRequest request =
                mkService.Buyers.Clients.Create(newClient, parent);
            Client response = null;

            Console.WriteLine("Creating client for buyer: {0}", parent);

            try
            {
                response = request.Execute();
            }
            catch (Exception exception)
            {
                throw new ApplicationException(
                    $"Real-time Bidding API returned error response:\n{exception.Message}");
            }

            Utilities.PrintClient(response);
        }
    }
}

Java

/*
 * Copyright 2021 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.api.services.samples.authorizedbuyers.marketplace.v1.buyers.clients;

import com.google.api.services.authorizedbuyersmarketplace.v1.AuthorizedBuyersMarketplace;
import com.google.api.services.authorizedbuyersmarketplace.v1.model.Client;
import com.google.api.services.samples.authorizedbuyers.marketplace.Utils;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.UUID;
import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.inf.ArgumentParser;
import net.sourceforge.argparse4j.inf.ArgumentParserException;
import net.sourceforge.argparse4j.inf.Namespace;

/** Creates a client for the given buyer account ID. */
public class CreateClients {

  public static void execute(AuthorizedBuyersMarketplace marketplaceClient, Namespace parsedArgs) {
    Long accountId = parsedArgs.getLong("account_id");

    String parentBuyerName = String.format("buyers/%d", accountId);

    Client newClient = new Client();
    newClient.setDisplayName(parsedArgs.getString("display_name"));
    newClient.setRole(parsedArgs.getString("role"));
    newClient.setSellerVisible(parsedArgs.getBoolean("seller_visible"));

    String partnerClientId = parsedArgs.getString("partner_client_id");
    if (partnerClientId != null) {
      newClient.setPartnerClientId(partnerClientId);
    }

    Client client = null;
    try {
      client = marketplaceClient.buyers().clients().create(parentBuyerName, newClient).execute();
    } catch (IOException ex) {
      System.out.printf("Marketplace API returned error response:%n%s", ex);
      System.exit(1);
    }

    System.out.printf("Created client for buyer Account ID '%d':%n", accountId);
    Utils.printClient(client);
  }

  public static void main(String[] args) {
    ArgumentParser parser =
        ArgumentParsers.newFor("CreateClients")
            .build()
            .defaultHelp(true)
            .description(("Creates a client for the given buyer account ID."));
    parser
        .addArgument("-a", "--account_id")
        .help("The resource ID of the buyers resource under which the client is to be created. ")
        .required(true)
        .type(Long.class);
    parser
        .addArgument("-d", "--display_name")
        .help(
            "Display name shown to publishers. Must be unique for clients without "
                + "partnerClientId specified. Maximum length of 255 characters is allowed. By "
                + "default, this sample will specify a generated name.")
        .type(String.class)
        .setDefault(String.format("TEST_CLIENT_%s", UUID.randomUUID()));
    parser
        .addArgument("-p", "--partner_client_id")
        .help(
            "Arbitrary unique identifier provided by the buyer. This field can be used to associate"
                + " a client with an identifier in the namespace of the buyer. If present, it must"
                + " be unique across all the clients. By default, this sample will not specify a"
                + "partnerClientId.")
        .type(String.class);
    parser
        .addArgument("-r", "--role")
        .help(
            "The role assigned to the client, which determines its permissions. By default, this"
                + " will be set to CLIENT_DEAL_VIEWER. For more details on how to interpret the"
                + " different roles, see: "
                + "https://developers.google.com/authorized-buyers/apis/marketplace/reference/rest/v1/buyers.clients#ClientRole")
        .type(String.class)
        .setDefault("CLIENT_DEAL_VIEWER");
    parser
        .addArgument("-s", "--seller_visible")
        .help(
            "Whether the client will be visible to publishers. By default, this sample will "
                + "set this to false.")
        .type(Boolean.class)
        .setDefault(false);

    Namespace parsedArgs = null;
    try {
      parsedArgs = parser.parseArgs(args);
    } catch (ArgumentParserException ex) {
      parser.handleError(ex);
      System.exit(1);
    }

    AuthorizedBuyersMarketplace client = null;
    try {
      client = Utils.getMarketplaceClient();
    } catch (IOException ex) {
      System.out.printf("Unable to create Marketplace API service:%n%s", ex);
      System.out.println("Did you specify a valid path to a service account key file?");
      System.exit(1);
    } catch (GeneralSecurityException ex) {
      System.out.printf("Unable to establish secure HttpTransport:%n%s", ex);
      System.exit(1);
    }

    execute(client, parsedArgs);
  }
}

Python

#!/usr/bin/python
#
# Copyright 2021 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Creates a client for the given buyer account ID."""


import argparse
import os
import pprint
import sys
import uuid

sys.path.insert(0, os.path.abspath('../../..'))

from googleapiclient.errors import HttpError
import util


_BUYER_NAME_TEMPLATE = 'buyers/%s'

DEFAULT_BUYER_RESOURCE_ID = 'ENTER_BUYER_RESOURCE_ID_HERE'


def main(marketplace, args):
    account_id = args.account_id

    client = {
        'displayName': args.display_name,
        'role': args.role,
        'sellerVisible': args.seller_visible
    }

    partner_client_id = args.partner_client_id
    if partner_client_id:
        client['partnerClientId'] = partner_client_id

    print(f'Creating client for buyer account ID "{account_id}":')
    try:
        # Construct and execute the request.
        response = (marketplace.buyers().clients().create(
            parent=_BUYER_NAME_TEMPLATE % account_id, body=client).execute())
    except HttpError as e:
        print(e)
        sys.exit(1)

    pprint.pprint(response)


if __name__ == '__main__':
    try:
        service = util.get_service(version='v1')
    except IOError as ex:
        print(f'Unable to create marketplace service - {ex}')
        print('Did you specify the key file in util.py?')
        sys.exit(1)

    def valid_role(value):
        valid_roles = (
            'CLIENT_DEAL_VIEWER', 'CLIENT_DEAL_VIEWER',
            'CLIENT_DEAL_NEGOTIATOR', 'CLIENT_DEAL_APPROVER')

        upper_input = value.upper()

        if upper_input in valid_roles:
            return upper_input
        else:
            raise ValueError(
                f'Invalid role specified. Must be one of: {valid_roles}')

    def valid_bool(value):
        upper_input = value.upper()

        if upper_input == 'TRUE':
            return True
        elif upper_input == 'FALSE':
            return False
        else:
            raise ValueError(
                'Invalid value specified. Must be a boolean input.')

    parser = argparse.ArgumentParser(
        description='Creates a client for the given buyer account ID.')

    # Required fields.
    parser.add_argument(
        '-a', '--account_id', default=DEFAULT_BUYER_RESOURCE_ID,
        help=('The resource ID of the buyers resource under which the '
              'client is to be created.'))
    # Optional fields.
    parser.add_argument(
        '-n', '--display_name', default='Test Client #%s' % uuid.uuid4(),
        help=('The display name shown to publishers. Must be unique for '
              'clients without partnerClientId specified. The maximum length '
              'allowed is 255 characters. By default, this sample will '
              'specify a generated name.'))
    parser.add_argument(
        '-p', '--partner_client_id', default=None,
        help=('Arbitrary unique identifier provided by the buyer. This field '
              'can be used to associate a client with an identifier in the '
              'namespace of the buyer. If present, it must be unique across '
              'all the clients. Be default, this sample will not specify a '
              'partnerClientId.'))
    parser.add_argument(
        '-r', '--role', default='CLIENT_DEAL_VIEWER', type=valid_role,
        help=('The role assigned to the client, which determines its '
              'permissions. By default, this will be set to '
              'CLIENT_DEAL_VIEWER. For more details on how to interpret the '
              'different roles, see: https://developers.google.com/'
              'authorized-buyers/apis/marketplace/reference/rest/v1/'
              'buyers.clients#ClientRole'))
    parser.add_argument(
        '-s', '--seller_visible', default=False, type=valid_bool,
        help=('Whether the client will be visible to publishers. By default, '
              'this sample will set this to False.'))

    main(service, parser.parse_args())

修补客户端

您可以使用 buyers.clients.patch 方法更新现有 Client。例如,您可以使用 patch 更新 displayName。以下示例演示了如何使用 patch 方法更新 Client

REST

请求

PATCH https://authorizedbuyersmarketplace.googleapis.com/v1/buyers/12345678/clients/873721984?updateMask=displayName&alt=json
Authorization: Bearer ACCESS_TOKEN
Content-Type: application/json

{
 "displayName": "Test Client #6a1849ca-f8ed-4ead-a3b9-75ef117b043f"
}

响应

{
 "name": "buyers/12345678/clients/873721984",
 "role": "CLIENT_DEAL_APPROVER",
 "state": "ACTIVE",
 "displayName": "Test Client #6a1849ca-f8ed-4ead-a3b9-75ef117b043f"
}

C#

/* Copyright 2021 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

using Google.Apis.AuthorizedBuyersMarketplace.v1;
using Google.Apis.AuthorizedBuyersMarketplace.v1.Data;
using Mono.Options;

using System;
using System.Collections.Generic;

namespace Google.Apis.AuthorizedBuyersMarketplace.Examples.v1.Buyers.Clients
{
    /// <summary>
    /// Patches a client with the specified name.
    /// </summary>
    public class PatchClients : ExampleBase
    {
        private AuthorizedBuyersMarketplaceService mkService;

        /// <summary>
        /// Constructor.
        /// </summary>
        public PatchClients()
        {
            mkService = Utilities.GetAuthorizedBuyersMarketplaceService();
        }

        /// <summary>
        /// Returns a description about the code example.
        /// </summary>
        public override string Description
        {
            get => "This code example patches a client having the specified name.";
        }

        /// <summary>
        /// Parse specified arguments.
        /// </summary>
        protected override Dictionary<string, object> ParseArguments(List<string> exampleArgs) {
            string[] requiredOptions = new string[] {"account_id", "client_id"};
            bool showHelp = false;

            string accountId = null;
            string clientId = null;
            string displayName = null;

            OptionSet options = new OptionSet {
                "Patches the specified client.",
                {
                    "h|help",
                    "Show help message and exit.",
                    h => showHelp = h != null
                },
                {
                    "a|account_id=",
                    ("[Required] The resource ID of the buyers resource under which the " +
                     "client was created. This will be used to construct the name used as a " +
                     "path parameter for the clients.patch request."),
                    a => accountId = a
                },
                {
                    "c|client_id=",
                    ("[Required] The resource ID of the buyers.clients resource for which the " +
                     "client was created. This will be used to construct the name used as a " +
                     "path parameter for the clients.patch request."),
                    c => clientId = c
                },
                {
                    "d|display_name=",
                    ("The display name shown to publishers. Must be unique for clients without " +
                     "partnerClientId specified. The maximum length allowed is 255 characters. " +
                     "By default, this sample will specify a generated name that will be used " +
                     "to patch the client's existing display name."),
                    d => displayName = d
                }
            };

            List<string> extras = options.Parse(exampleArgs);
            var parsedArgs = new Dictionary<string, object>();

            // Show help message.
            if (showHelp == true)
            {
                options.WriteOptionDescriptions(Console.Out);
                Environment.Exit(0);
            }
            // Set arguments.
            parsedArgs["account_id"] = accountId;
            parsedArgs["client_id"] = clientId;
            parsedArgs["display_name"] = displayName ?? $"Test-Client-{System.Guid.NewGuid()}";

            // Validate that options were set correctly.
            Utilities.ValidateOptions(options, parsedArgs, requiredOptions, extras);

            return parsedArgs;
        }

        /// <summary>
        /// Run the example.
        /// </summary>
        /// <param name="parsedArgs">Parsed arguments for the example.</param>
        protected override void Run(Dictionary<string, object> parsedArgs)
        {
            var accountId = (string) parsedArgs["account_id"];
            var clientId = (string) parsedArgs["client_id"];
            var name = $"buyers/{accountId}/clients/{clientId}";

            Client clientPatch = new Client()
            {
                DisplayName = (string) parsedArgs["display_name"]
            };

            BuyersResource.ClientsResource.PatchRequest request =
                mkService.Buyers.Clients.Patch(clientPatch, name);
            // Configure the update mask such that only the displayName is updated. If not set, the
            // patch method would overwrite all other writable fields with a null value.
            request.UpdateMask = "displayName";

            Client response = null;

            Console.WriteLine("Patching client with name: {0}", name);

            try
            {
                response = request.Execute();
            }
            catch (Exception exception)
            {
                throw new ApplicationException(
                    $"Real-time Bidding API returned error response:\n{exception.Message}");
            }

            Utilities.PrintClient(response);
        }
    }
}

Java

/*
 * Copyright 2021 Google LLC
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *    https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.google.api.services.samples.authorizedbuyers.marketplace.v1.buyers.clients;

import com.google.api.services.authorizedbuyersmarketplace.v1.AuthorizedBuyersMarketplace;
import com.google.api.services.authorizedbuyersmarketplace.v1.model.Client;
import com.google.api.services.samples.authorizedbuyers.marketplace.Utils;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.UUID;
import net.sourceforge.argparse4j.ArgumentParsers;
import net.sourceforge.argparse4j.inf.ArgumentParser;
import net.sourceforge.argparse4j.inf.ArgumentParserException;
import net.sourceforge.argparse4j.inf.Namespace;

/** Patches a client with the specified name. */
public class PatchClients {

  public static void execute(AuthorizedBuyersMarketplace marketplaceClient, Namespace parsedArgs) {
    Long accountId = parsedArgs.getLong("account_id");
    Long clientId = parsedArgs.getLong("client_id");
    String name = String.format("buyers/%d/clients/%d", accountId, clientId);

    Client update = new Client();
    update.setDisplayName(parsedArgs.getString("display_name"));

    String uMask = "displayName";

    Client client = null;
    try {
      client =
          marketplaceClient.buyers().clients().patch(name, update).setUpdateMask(uMask).execute();
    } catch (IOException ex) {
      System.out.printf("Marketplace API returned error response:%n%s", ex);
      System.exit(1);
    }

    System.out.printf("Patched client for buyer Account ID '%d':%n", accountId);
    Utils.printClient(client);
  }

  public static void main(String[] args) {
    ArgumentParser parser =
        ArgumentParsers.newFor("PatchClients")
            .build()
            .defaultHelp(true)
            .description(("Patches a client for the given buyer account ID and client ID."));
    parser
        .addArgument("-a", "--account_id")
        .help("The resource ID of the buyers resource under which the client was created.")
        .required(true)
        .type(Long.class);
    parser
        .addArgument("-c", "--client_id")
        .help("The resource ID of the buyers.clients resource under which the client was created.")
        .required(true)
        .type(Long.class);
    parser
        .addArgument("-d", "--display_name")
        .help(
            "Display name shown to publishers. Must be unique for clients without partnerClientId"
                + " specified. Maximum length of 255 characters is allowed. By default, this sample"
                + " will specify a generated name that will be used to patch the client's existing"
                + " display name.")
        .type(String.class)
        .setDefault(String.format("TEST_CLIENT_%s", UUID.randomUUID()));

    Namespace parsedArgs = null;
    try {
      parsedArgs = parser.parseArgs(args);
    } catch (ArgumentParserException ex) {
      parser.handleError(ex);
      System.exit(1);
    }

    AuthorizedBuyersMarketplace client = null;
    try {
      client = Utils.getMarketplaceClient();
    } catch (IOException ex) {
      System.out.printf("Unable to create Marketplace API service:%n%s", ex);
      System.out.println("Did you specify a valid path to a service account key file?");
      System.exit(1);
    } catch (GeneralSecurityException ex) {
      System.out.printf("Unable to establish secure HttpTransport:%n%s", ex);
      System.exit(1);
    }

    execute(client, parsedArgs);
  }
}

Python

#!/usr/bin/python
#
# Copyright 2021 Google Inc. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Patches a client for the given account ID and client ID."""


import argparse
import os
import pprint
import sys
import uuid

sys.path.insert(0, os.path.abspath('../../..'))

from googleapiclient.errors import HttpError
import util


_CLIENT_NAME_TEMPLATE = 'buyers/%s/clients/%s'

DEFAULT_BUYER_RESOURCE_ID = 'ENTER_BUYER_RESOURCE_ID_HERE'


def main(marketplace, args):
    account_id = args.account_id
    client_id = args.client_id

    client = {
        'displayName': args.display_name
    }

    print(f'Patching client {client_id} for buyer account ID "{account_id}":')
    try:
        # Construct and execute the request.
        response = marketplace.buyers().clients().patch(
            name=_CLIENT_NAME_TEMPLATE % (account_id, client_id), body=client,
            updateMask='displayName').execute()
    except HttpError as e:
        print(e)
        sys.exit(1)

    pprint.pprint(response)


if __name__ == '__main__':
    try:
        service = util.get_service(version='v1')
    except IOError as ex:
        print(f'Unable to create marketplace service - {ex}')
        print('Did you specify the key file in util.py?')
        sys.exit(1)

    parser = argparse.ArgumentParser(
        description=(
            'Patches a client for the given buyer account ID and client ID.'))

    # Required fields.
    parser.add_argument(
        '-a', '--account_id', default=DEFAULT_BUYER_RESOURCE_ID,
        help=('The resource ID of the buyers resource under which the '
              'client was created.'))
    parser.add_argument(
        '-c', '--client_id', default=DEFAULT_BUYER_RESOURCE_ID,
        help=('The resource ID of the buyers.clients resource under which the '
              'client was created. This will be used to construct the name '
              'used as a path parameter for the buyers.clients.patch request.')
        )
    # Optional fields.
    parser.add_argument(
        '-n', '--display_name', default='Test Client #%s' % uuid.uuid4(),
        help=('The display name shown to publishers. Must be unique for '
              'clients without partnerClientId specified. The maximum length '
              'allowed is 255 characters. By default, this sample will '
              'specify a generated name that will be used to patch the '
              'client\'s existing display name.'))

    main(service, parser.parse_args())