gateway-iot/python/alicloud_gateway_iot/client.py (188 lines of code) (raw):

# -*- coding: utf-8 -*- # This file is auto-generated, don't edit it. Thanks. import time from Tea.request import TeaRequest from Tea.exceptions import TeaException, UnretryableException from Tea.core import TeaCore from alibabacloud_darabonba_encode_util.encoder import Encoder from alibabacloud_darabonba_signature_util.signer import Signer from typing import Dict from alicloud_gateway_iot import models as gateway_iot_models from alibabacloud_tea_util import models as util_models from alibabacloud_tea_util.client import Client as UtilClient from alibabacloud_url.client import Client as UrlClient from alibabacloud_darabonba_number.client import Client as NumberClient from alibabacloud_openapi_util.client import Client as OpenApiUtilClient from alibabacloud_darabonba_map.client import Client as MapClient from alibabacloud_darabonba_array.client import Client as ArrayClient class Client: _app_key: str = None _app_secret: str = None _endpoint: str = None def __init__( self, config: gateway_iot_models.Config, ): self._app_key = config.app_key self._app_secret = config.app_secret self._endpoint = config.endpoint def execute( self, request: gateway_iot_models.OpenApiRequest, runtime: util_models.RuntimeOptions, ) -> str: request.validate() runtime.validate() _runtime = { 'timeouted': 'retry', 'readTimeout': runtime.read_timeout, 'connectTimeout': runtime.connect_timeout, 'maxIdleConns': runtime.max_idle_conns, 'retry': { 'retryable': runtime.autoretry, 'maxAttempts': runtime.max_attempts }, 'ignoreSSL': runtime.ignore_ssl } _last_request = None _last_exception = None _now = time.time() _retry_times = 0 while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now): if _retry_times > 0: _backoff_time = TeaCore.get_backoff_time(_runtime.get('backoff'), _retry_times) if _backoff_time > 0: TeaCore.sleep(_backoff_time) _retry_times = _retry_times + 1 try: _request = TeaRequest() method = UtilClient.default_string(request.method, 'POST') _request.method = method url = UrlClient.parse_url(self._endpoint) _request.protocol = url.scheme _request.pathname = UtilClient.default_string(request.pathname, url.path.pathname) _request.port = NumberClient.parse_int(url.host.port) _request.headers = TeaCore.merge({ 'host': url.host.hostname }, request.headers) params = {} if not UtilClient.is_unset(request.body): tmp = UtilClient.assert_as_map(request.body) params = OpenApiUtilClient.query(tmp) params = TeaCore.merge({ 'AppKey': self._app_key }, request.query, params) params['Signature'] = self.sign(method, self._app_secret, params) if UtilClient.equal_string(method, 'GET'): _request.query = params else: form_obj = UtilClient.to_form_string(params) _request.body = form_obj _request.headers['content-type'] = 'application/x-www-form-urlencoded' _last_request = _request _response = TeaCore.do_action(_request, _runtime) if UtilClient.is_4xx(_response.status_code) or UtilClient.is_5xx(_response.status_code): res = UtilClient.read_as_json(_response.body) err = UtilClient.assert_as_map(res) err['statusCode'] = _response.status_code raise TeaException({ 'code': f"{err.get('Code')}", 'message': f"statusCode: {err.get('statusCode')}, errorMessage: {err.get('ErrorMessage')}, requestId: {err.get('RequestId')}", 'data': err }) return UtilClient.read_as_string(_response.body) except Exception as e: if TeaCore.is_retryable(e): _last_exception = e continue raise e raise UnretryableException(_last_request, _last_exception) async def execute_async( self, request: gateway_iot_models.OpenApiRequest, runtime: util_models.RuntimeOptions, ) -> str: request.validate() runtime.validate() _runtime = { 'timeouted': 'retry', 'readTimeout': runtime.read_timeout, 'connectTimeout': runtime.connect_timeout, 'maxIdleConns': runtime.max_idle_conns, 'retry': { 'retryable': runtime.autoretry, 'maxAttempts': runtime.max_attempts }, 'ignoreSSL': runtime.ignore_ssl } _last_request = None _last_exception = None _now = time.time() _retry_times = 0 while TeaCore.allow_retry(_runtime.get('retry'), _retry_times, _now): if _retry_times > 0: _backoff_time = TeaCore.get_backoff_time(_runtime.get('backoff'), _retry_times) if _backoff_time > 0: TeaCore.sleep(_backoff_time) _retry_times = _retry_times + 1 try: _request = TeaRequest() method = UtilClient.default_string(request.method, 'POST') _request.method = method url = UrlClient.parse_url(self._endpoint) _request.protocol = url.scheme _request.pathname = UtilClient.default_string(request.pathname, url.path.pathname) _request.port = NumberClient.parse_int(url.host.port) _request.headers = TeaCore.merge({ 'host': url.host.hostname }, request.headers) params = {} if not UtilClient.is_unset(request.body): tmp = UtilClient.assert_as_map(request.body) params = OpenApiUtilClient.query(tmp) params = TeaCore.merge({ 'AppKey': self._app_key }, request.query, params) params['Signature'] = self.sign(method, self._app_secret, params) if UtilClient.equal_string(method, 'GET'): _request.query = params else: form_obj = UtilClient.to_form_string(params) _request.body = form_obj _request.headers['content-type'] = 'application/x-www-form-urlencoded' _last_request = _request _response = await TeaCore.async_do_action(_request, _runtime) if UtilClient.is_4xx(_response.status_code) or UtilClient.is_5xx(_response.status_code): res = await UtilClient.read_as_json_async(_response.body) err = UtilClient.assert_as_map(res) err['statusCode'] = _response.status_code raise TeaException({ 'code': f"{err.get('Code')}", 'message': f"statusCode: {err.get('statusCode')}, errorMessage: {err.get('ErrorMessage')}, requestId: {err.get('RequestId')}", 'data': err }) return await UtilClient.read_as_string_async(_response.body) except Exception as e: if TeaCore.is_retryable(e): _last_exception = e continue raise e raise UnretryableException(_last_request, _last_exception) @staticmethod def sign( method: str, app_secret: str, params: Dict[str, str], ) -> str: keys = MapClient.key_set(params) sorted_keys = ArrayClient.asc_sort(keys) canonicalized_resource = '' separator = '' for key in sorted_keys: canonicalized_resource = f'{canonicalized_resource}{separator}{Encoder.percent_encode(key)}' if not UtilClient.empty(params.get(key)): canonicalized_resource = f'{canonicalized_resource}={Encoder.percent_encode(params.get(key))}' separator = '&' sign_to_string = f"{method}&{Encoder.percent_encode('/')}&{Encoder.percent_encode(canonicalized_resource)}" sign_data = Signer.hmac_sha1sign(sign_to_string, f'{app_secret}&') return Encoder.base_64encode_to_string(sign_data)