diff --git a/csharp/core/Client.cs b/csharp/core/Client.cs index 09a7bf3..e205a81 100644 --- a/csharp/core/Client.cs +++ b/csharp/core/Client.cs @@ -1723,6 +1723,7 @@ public Dictionary DoRequest(Params params_, OpenApiRequest reque } else { + AlibabaCloud.TeaUtil.Common.ReadAsString(response_.Body); return new Dictionary { {"headers", response_.Headers}, @@ -1987,6 +1988,7 @@ public async Task> DoRequestAsync(Params params_, Ope } else { + AlibabaCloud.TeaUtil.Common.ReadAsString(response_.Body); return new Dictionary { {"headers", response_.Headers}, diff --git a/csharp/core/Properties/AssemblyInfo.cs b/csharp/core/Properties/AssemblyInfo.cs index 705f199..bc7b354 100644 --- a/csharp/core/Properties/AssemblyInfo.cs +++ b/csharp/core/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // Build Number // Revision // -[assembly : AssemblyVersion("0.1.6.0")] -[assembly : AssemblyFileVersion("0.1.6.0")] +[assembly : AssemblyVersion("0.1.7.0")] +[assembly : AssemblyFileVersion("0.1.7.0")] diff --git a/csharp/core/client.csproj b/csharp/core/client.csproj index 0faa85a..d68000f 100644 --- a/csharp/core/client.csproj +++ b/csharp/core/client.csproj @@ -40,11 +40,11 @@ all runtime; build; native; contentfiles; analyzers - + - + \ No newline at end of file diff --git a/golang/client/client.go b/golang/client/client.go index 2f6c606..9abba17 100644 --- a/golang/client/client.go +++ b/golang/client/client.go @@ -5,14 +5,13 @@ package client import ( - "io" - spi "github.com/alibabacloud-go/alibabacloud-gateway-spi/client" openapiutil "github.com/alibabacloud-go/openapi-util/service" util "github.com/alibabacloud-go/tea-utils/v2/service" xml "github.com/alibabacloud-go/tea-xml/service" "github.com/alibabacloud-go/tea/tea" credential "github.com/aliyun/credentials-go/credentials" + "io" ) type GlobalParameters struct { @@ -1476,6 +1475,10 @@ func (client *Client) DoRequest(params *Params, request *OpenApiRequest, runtime }, &_result) return _result, _err } else { + _, _err = util.ReadAsString(response_.Body) + if _err != nil { + return _result, _err + } _result = make(map[string]interface{}) _err = tea.Convert(map[string]interface{}{ "headers": response_.Headers, diff --git a/java/src/main/java/com/aliyun/teaopenapi/Client.java b/java/src/main/java/com/aliyun/teaopenapi/Client.java index 1e372d9..f2ada1c 100644 --- a/java/src/main/java/com/aliyun/teaopenapi/Client.java +++ b/java/src/main/java/com/aliyun/teaopenapi/Client.java @@ -20,9 +20,6 @@ public class Client { public String _endpointRule; public java.util.Map _endpointMap; public String _suffix; - public String _key; - public String _cert; - public String _ca; public Integer _readTimeout; public Integer _connectTimeout; public String _httpProxy; @@ -41,6 +38,9 @@ public class Client { public java.util.Map _headers; public com.aliyun.gateway.spi.Client _spi; public GlobalParameters _globalParameters; + public String _key; + public String _cert; + public String _ca; /** * Init client with Config * @param config config contains the necessary information to create a client @@ -79,9 +79,6 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { this._method = config.method; this._regionId = config.regionId; this._userAgent = config.userAgent; - this._key = config.key; - this._cert = config.cert; - this._ca = config.ca; this._readTimeout = config.readTimeout; this._connectTimeout = config.connectTimeout; this._httpProxy = config.httpProxy; @@ -93,8 +90,23 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { this._signatureVersion = config.signatureVersion; this._signatureAlgorithm = config.signatureAlgorithm; this._globalParameters = config.globalParameters; + this._key = config.key; + this._cert = config.cert; + this._ca = config.ca; } + /** + * Encapsulate the request and invoke the network + * @param action api name + * @param version product version + * @param protocol http or https + * @param method e.g. GET + * @param authType authorization type e.g. AK + * @param bodyType response body type e.g. String + * @param request object of OpenApiRequest + * @param runtime which controls some details of call api, such as retry times + * @return the response + */ public java.util.Map doRPCRequest(String action, String version, String protocol, String method, String authType, String bodyType, OpenApiRequest request, com.aliyun.teautil.models.RuntimeOptions runtime) throws Exception { TeaModel.validateParams(request, "request"); java.util.Map runtime_ = TeaConverter.buildMap( @@ -123,7 +135,6 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { TeaRequest _lastRequest = null; Exception _lastException = null; - TeaResponse _lastResponse = null; long _now = System.currentTimeMillis(); int _retryTimes = 0; while (Tea.allowRetry((java.util.Map) runtime_.get("retry"), _retryTimes, _now)) { @@ -221,7 +232,6 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { _lastRequest = request_; TeaResponse response_ = Tea.doAction(request_, runtime_, interceptorChain); - _lastResponse = response_; if (com.aliyun.teautil.Common.is4xx(response_.statusCode) || com.aliyun.teautil.Common.is5xx(response_.statusCode)) { Object _res = com.aliyun.teautil.Common.readAsJSON(response_.body); @@ -286,17 +296,24 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { continue; } throw e; - } finally { - if (!com.aliyun.teautil.Common.isUnset(_lastResponse) - && !com.aliyun.teautil.Common.isUnset(_lastResponse.response) - && !com.aliyun.teautil.Common.isUnset(_lastResponse.response.body())){ - _lastResponse.response.close(); - } } } throw new TeaUnretryableException(_lastRequest, _lastException); } + /** + * Encapsulate the request and invoke the network + * @param action api name + * @param version product version + * @param protocol http or https + * @param method e.g. GET + * @param authType authorization type e.g. AK + * @param pathname pathname of every api + * @param bodyType response body type e.g. String + * @param request object of OpenApiRequest + * @param runtime which controls some details of call api, such as retry times + * @return the response + */ public java.util.Map doROARequest(String action, String version, String protocol, String method, String authType, String pathname, String bodyType, OpenApiRequest request, com.aliyun.teautil.models.RuntimeOptions runtime) throws Exception { TeaModel.validateParams(request, "request"); java.util.Map runtime_ = TeaConverter.buildMap( @@ -325,7 +342,6 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { TeaRequest _lastRequest = null; Exception _lastException = null; - TeaResponse _lastResponse = null; long _now = System.currentTimeMillis(); int _retryTimes = 0; while (Tea.allowRetry((java.util.Map) runtime_.get("retry"), _retryTimes, _now)) { @@ -398,7 +414,6 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { _lastRequest = request_; TeaResponse response_ = Tea.doAction(request_, runtime_, interceptorChain); - _lastResponse = response_; if (com.aliyun.teautil.Common.equalNumber(response_.statusCode, 204)) { return TeaConverter.buildMap( @@ -470,17 +485,24 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { continue; } throw e; - } finally { - if (!com.aliyun.teautil.Common.isUnset(_lastResponse) - && !com.aliyun.teautil.Common.isUnset(_lastResponse.response) - && !com.aliyun.teautil.Common.isUnset(_lastResponse.response.body())){ - _lastResponse.response.close(); - } } } throw new TeaUnretryableException(_lastRequest, _lastException); } + /** + * Encapsulate the request and invoke the network with form body + * @param action api name + * @param version product version + * @param protocol http or https + * @param method e.g. GET + * @param authType authorization type e.g. AK + * @param pathname pathname of every api + * @param bodyType response body type e.g. String + * @param request object of OpenApiRequest + * @param runtime which controls some details of call api, such as retry times + * @return the response + */ public java.util.Map doROARequestWithForm(String action, String version, String protocol, String method, String authType, String pathname, String bodyType, OpenApiRequest request, com.aliyun.teautil.models.RuntimeOptions runtime) throws Exception { TeaModel.validateParams(request, "request"); java.util.Map runtime_ = TeaConverter.buildMap( @@ -509,7 +531,6 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { TeaRequest _lastRequest = null; Exception _lastException = null; - TeaResponse _lastResponse = null; long _now = System.currentTimeMillis(); int _retryTimes = 0; while (Tea.allowRetry((java.util.Map) runtime_.get("retry"), _retryTimes, _now)) { @@ -583,7 +604,6 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { _lastRequest = request_; TeaResponse response_ = Tea.doAction(request_, runtime_, interceptorChain); - _lastResponse = response_; if (com.aliyun.teautil.Common.equalNumber(response_.statusCode, 204)) { return TeaConverter.buildMap( @@ -653,17 +673,23 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { continue; } throw e; - } finally { - if (!com.aliyun.teautil.Common.isUnset(_lastResponse) - && !com.aliyun.teautil.Common.isUnset(_lastResponse.response) - && !com.aliyun.teautil.Common.isUnset(_lastResponse.response.body())){ - _lastResponse.response.close(); - } } } throw new TeaUnretryableException(_lastRequest, _lastException); } + /** + * Encapsulate the request and invoke the network + * @param action api name + * @param version product version + * @param protocol http or https + * @param method e.g. GET + * @param authType authorization type e.g. AK + * @param bodyType response body type e.g. String + * @param request object of OpenApiRequest + * @param runtime which controls some details of call api, such as retry times + * @return the response + */ public java.util.Map doRequest(Params params, OpenApiRequest request, com.aliyun.teautil.models.RuntimeOptions runtime) throws Exception { TeaModel.validateParams(params, "params"); TeaModel.validateParams(request, "request"); @@ -693,7 +719,6 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { TeaRequest _lastRequest = null; Exception _lastException = null; - TeaResponse _lastResponse = null; long _now = System.currentTimeMillis(); int _retryTimes = 0; while (Tea.allowRetry((java.util.Map) runtime_.get("retry"), _retryTimes, _now)) { @@ -801,7 +826,6 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { _lastRequest = request_; TeaResponse response_ = Tea.doAction(request_, runtime_, interceptorChain); - _lastResponse = response_; if (com.aliyun.teautil.Common.is4xx(response_.statusCode) || com.aliyun.teautil.Common.is5xx(response_.statusCode)) { java.util.Map err = new java.util.HashMap<>(); @@ -861,6 +885,7 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { new TeaPair("statusCode", response_.statusCode) ); } else { + com.aliyun.teautil.Common.readAsString(response_.body); return TeaConverter.buildMap( new TeaPair("headers", response_.headers), new TeaPair("statusCode", response_.statusCode) @@ -873,17 +898,23 @@ public Client(com.aliyun.teaopenapi.models.Config config) throws Exception { continue; } throw e; - } finally { - if (!com.aliyun.teautil.Common.isUnset(_lastResponse) - && !com.aliyun.teautil.Common.isUnset(_lastResponse.response) - && !com.aliyun.teautil.Common.isUnset(_lastResponse.response.body())){ - _lastResponse.response.close(); - } } } throw new TeaUnretryableException(_lastRequest, _lastException); } + /** + * Encapsulate the request and invoke the network + * @param action api name + * @param version product version + * @param protocol http or https + * @param method e.g. GET + * @param authType authorization type e.g. AK + * @param bodyType response body type e.g. String + * @param request object of OpenApiRequest + * @param runtime which controls some details of call api, such as retry times + * @return the response + */ public java.util.Map execute(Params params, OpenApiRequest request, com.aliyun.teautil.models.RuntimeOptions runtime) throws Exception { TeaModel.validateParams(params, "params"); TeaModel.validateParams(request, "request"); diff --git a/main.tea b/main.tea index 445f722..78cba21 100644 --- a/main.tea +++ b/main.tea @@ -799,6 +799,7 @@ api doRequest(params: Params, request: OpenApiRequest, runtime: Util.RuntimeOpti statusCode = __response.statusCode }; } else { + Util.readAsString(__response.body); return { headers = __response.headers, statusCode = __response.statusCode diff --git a/php/composer.json b/php/composer.json index be01579..5b3f7a2 100644 --- a/php/composer.json +++ b/php/composer.json @@ -11,7 +11,7 @@ ], "require": { "php": ">5.5", - "alibabacloud/tea-utils": "^0.2.17", + "alibabacloud/tea-utils": "^0.2.19", "alibabacloud/credentials": "^1.1", "alibabacloud/openapi-util": "^0.1.10|^0.2.1", "alibabacloud/gateway-spi": "^1", diff --git a/php/phpunit.xml b/php/phpunit.xml new file mode 100644 index 0000000..796384a --- /dev/null +++ b/php/phpunit.xml @@ -0,0 +1,31 @@ + + + + + + tests + + + ./tests/Unit + + + + + + integration + + + + + + + + + + + ./src + + + diff --git a/php/src/OpenApiClient.php b/php/src/OpenApiClient.php index 24eb57e..a437017 100644 --- a/php/src/OpenApiClient.php +++ b/php/src/OpenApiClient.php @@ -855,6 +855,7 @@ public function doRequest($params, $request, $runtime) "statusCode" => $_response->statusCode ]; } else { + Utils::readAsString($_response->body); return [ "headers" => $_response->headers, "statusCode" => $_response->statusCode diff --git a/php/tests/OpenApiClientTest.php b/php/tests/OpenApiClientTest.php new file mode 100644 index 0000000..9ce72e2 --- /dev/null +++ b/php/tests/OpenApiClientTest.php @@ -0,0 +1,328 @@ + [ + "global-key" => "global-value" + ], + "queries" => [ + "global-query" => "global-value" + ] + ]); + $config = new Config([ + "endpoint" => "config.endpoint", + "endpointType" => "regional", + "network" => "config.network", + "suffix" => "config.suffix", + "protocol" => "config.protocol", + "method" => "config.method", + "regionId" => "config.regionId", + "userAgent" => "config.userAgent", + "readTimeout" => 3000, + "connectTimeout" => 3000, + "httpProxy" => "config.httpProxy", + "httpsProxy" => "config.httpsProxy", + "noProxy" => "config.noProxy", + "socks5Proxy" => "config.socks5Proxy", + "socks5NetWork" => "config.socks5NetWork", + "maxIdleConns" => 128, + "signatureVersion" => "config.signatureVersion", + "signatureAlgorithm" => "config.signatureAlgorithm", + "globalParameters" => $globalParameters + ]); + $creConfig = new \AlibabaCloud\Credentials\Credential\Config([ + "accessKeyId" => "accessKeyId", + "accessKeySecret" => "accessKeySecret", + "securityToken" => "securityToken", + "type" => "sts" + ]); + $credential = new Credential($creConfig); + $config->credential = $credential; + $client = new OpenApiClient($config); + $config->accessKeyId = "ak"; + $config->accessKeySecret = "secret"; + $config->securityToken = "token"; + $config->type = "sts"; + $client = new OpenApiClient($config); + } + + /** + * @return Config + */ + public static function createConfig(){ + $globalParameters = new GlobalParameters([ + "headers" => [ + "global-key" => "global-value" + ], + "queries" => [ + "global-query" => "global-value" + ] + ]); + $config = new Config([ + "accessKeyId" => "ak", + "accessKeySecret" => "secret", + "securityToken" => "token", + "type" => "sts", + "userAgent" => "config.userAgent", + "readTimeout" => 3000, + "connectTimeout" => 3000, + "maxIdleConns" => 128, + "signatureVersion" => "config.signatureVersion", + "signatureAlgorithm" => "ACS3-HMAC-SHA256", + "globalParameters" => $globalParameters + ]); + return $config; + } + + /** + * @return RuntimeOptions + */ + public static function createRuntimeOptions(){ + $runtime = new RuntimeOptions([ + "readTimeout" => 4000, + "connectTimeout" => 4000, + "maxIdleConns" => 100, + "autoretry" => true, + "maxAttempts" => 1, + "backoffPolicy" => "no", + "backoffPeriod" => 1, + "ignoreSSL" => true + ]); + return $runtime; + } + + /** + * @return OpenApiRequest + */ + public static function createOpenApiRequest(){ + $query = []; + $query["key1"] = "value"; + $query["key2"] = 1; + $query["key3"] = true; + $body = []; + $body["key1"] = "value"; + $body["key2"] = 1; + $body["key3"] = true; + $headers = [ + "for-test" => "sdk" + ]; + $req = new OpenApiRequest([ + "headers" => $headers, + "query" => OpenApiUtilClient::query($query), + "body" => OpenApiUtilClient::parseToMap($body) + ]); + return $req; + } + + public function testCallApiForRPCWithV2Sign_AK_Form(){ + $config = self::createConfig(); + $runtime = self::createRuntimeOptions(); + $config->protocol = "HTTP"; + $config->signatureAlgorithm = "v2"; + $config->endpoint = "test.aliyuncs.com"; + $client = new OpenApiClient($config); + $request = self::createOpenApiRequest(); + $params = new Params([ + "action" => "TestAPI", + "version" => "2022-06-01", + "protocol" => "HTTPS", + "pathname" => "/", + "method" => "POST", + "authType" => "AK", + "style" => "RPC", + "reqBodyType" => "formData", + "bodyType" => "json" + ]); + $client->callApi($params, $request, $runtime); + } + + public function testCallApiForRPCWithV2Sign_Anonymous_JSON(){ + $config = self::createConfig(); + $runtime = self::createRuntimeOptions(); + $config->protocol = "HTTP"; + $config->signatureAlgorithm = "v2"; + $config->endpoint = "test.aliyuncs.com"; + $client = new OpenApiClient($config); + $request = self::createOpenApiRequest(); + $params = new Params([ + "action" => "TestAPI", + "version" => "2022-06-01", + "protocol" => "HTTPS", + "pathname" => "/", + "method" => "POST", + "authType" => "Anonymous", + "style" => "RPC", + "reqBodyType" => "json", + "bodyType" => "json" + ]); + $client->callApi($params, $request, $runtime); + } + + public function testCallApiForROAWithV2Sign_HTTPS_AK_Form(){ + $config = self::createConfig(); + $runtime = self::createRuntimeOptions(); + $config->signatureAlgorithm = "v2"; + $config->endpoint = "test.aliyuncs.com"; + $client = new OpenApiClient($config); + $request = self::createOpenApiRequest(); + $params = new Params([ + "action" => "TestAPI", + "version" => "2022-06-01", + "protocol" => "HTTPS", + "pathname" => "/test", + "method" => "POST", + "authType" => "AK", + "style" => "ROA", + "reqBodyType" => "formData", + "bodyType" => "json" + ]); + $client->callApi($params, $request, $runtime); + } + + public function testCallApiForROAWithV2Sign_Anonymous_JSON(){ + $config = self::createConfig(); + $runtime = self::createRuntimeOptions(); + $config->protocol = "HTTP"; + $config->signatureAlgorithm = "v2"; + $config->endpoint = "test.aliyuncs.com"; + $client = new OpenApiClient($config); + $request = self::createOpenApiRequest(); + $params = new Params([ + "action" => "TestAPI", + "version" => "2022-06-01", + "protocol" => "HTTPS", + "pathname" => "/test", + "method" => "POST", + "authType" => "Anonymous", + "style" => "ROA", + "reqBodyType" => "json", + "bodyType" => "json" + ]); + $client->callApi($params, $request, $runtime); + } + + public function testCallApiForRPCWithV3Sign_AK_Form(){ + $config = self::createConfig(); + $runtime = self::createRuntimeOptions(); + $config->protocol = "HTTP"; + $config->endpoint = "test.aliyuncs.com"; + $client = new OpenApiClient($config); + $request = self::createOpenApiRequest(); + $params = new Params([ + "action" => "TestAPI", + "version" => "2022-06-01", + "protocol" => "HTTPS", + "pathname" => "/", + "method" => "POST", + "authType" => "AK", + "style" => "RPC", + "reqBodyType" => "formData", + "bodyType" => "json" + ]); + $client->callApi($params, $request, $runtime); + } + + public function testCallApiForRPCWithV3Sign_Anonymous_JSON(){ + $config = self::createConfig(); + $runtime = self::createRuntimeOptions(); + $config->protocol = "HTTP"; + $config->endpoint = "test.aliyuncs.com"; + $client = new OpenApiClient($config); + $request = self::createOpenApiRequest(); + $params = new Params([ + "action" => "TestAPI", + "version" => "2022-06-01", + "protocol" => "HTTPS", + "pathname" => "/", + "method" => "POST", + "authType" => "Anonymous", + "style" => "RPC", + "reqBodyType" => "json", + "bodyType" => "json" + ]); + $client->callApi($params, $request, $runtime); + } + + public function testCallApiForROAWithV3Sign_AK_Form(){ + $config = self::createConfig(); + $runtime = self::createRuntimeOptions(); + $config->protocol = "HTTP"; + $config->endpoint = "test.aliyuncs.com"; + $client = new OpenApiClient($config); + $request = self::createOpenApiRequest(); + $params = new Params([ + "action" => "TestAPI", + "version" => "2022-06-01", + "protocol" => "HTTPS", + "pathname" => "/test", + "method" => "POST", + "authType" => "AK", + "style" => "ROA", + "reqBodyType" => "formData", + "bodyType" => "json" + ]); + $client->callApi($params, $request, $runtime); + } + + public function testCallApiForROAWithV3Sign_Anonymous_JSON(){ + $config = self::createConfig(); + $runtime = self::createRuntimeOptions(); + $config->protocol = "HTTP"; + $config->endpoint = "test.aliyuncs.com"; + $client = new OpenApiClient($config); + $request = self::createOpenApiRequest(); + $params = new Params([ + "action" => "TestAPI", + "version" => "2022-06-01", + "protocol" => "HTTPS", + "pathname" => "/test", + "method" => "POST", + "authType" => "Anonymous", + "style" => "ROA", + "reqBodyType" => "json", + "bodyType" => "json" + ]); + $client->callApi($params, $request, $runtime); + } + + public function testResponseBodyType(){ + $config = self::createConfig(); + $runtime = self::createRuntimeOptions(); + $config->protocol = "HTTP"; + $config->endpoint = "test.aliyuncs.com"; + $client = new OpenApiClient($config); + $request = self::createOpenApiRequest(); + $params = new Params([ + "action" => "TestAPI", + "version" => "2022-06-01", + "protocol" => "HTTPS", + "pathname" => "/test", + "method" => "POST", + "authType" => "AK", + "style" => "ROA", + "reqBodyType" => "formData", + "bodyType" => "json" + ]); + $client->callApi($params, $request, $runtime); + $params->bodyType = "array"; + $client->callApi($params, $request, $runtime); + $params->bodyType = "string"; + $client->callApi($params, $request, $runtime); + $params->bodyType = "byte"; + $client->callApi($params, $request, $runtime); + } +} diff --git a/php/tests/bootstrap.php b/php/tests/bootstrap.php new file mode 100644 index 0000000..c62c4e8 --- /dev/null +++ b/php/tests/bootstrap.php @@ -0,0 +1,3 @@ +=0.3.8, <1.0.0", + "alibabacloud_tea_util>=0.3.9, <1.0.0", "alibabacloud_credentials>=0.3.1, <1.0.0", "alibabacloud_openapi_util>=0.2.1, <1.0.0", "alibabacloud_gateway_spi>=0.0.1, <1.0.0", diff --git a/python2/alibabacloud_tea_openapi/client.py b/python2/alibabacloud_tea_openapi/client.py index 66a2a0b..9e9c0cd 100644 --- a/python2/alibabacloud_tea_openapi/client.py +++ b/python2/alibabacloud_tea_openapi/client.py @@ -814,6 +814,7 @@ def do_request(self, params, request, runtime): 'statusCode': _response.status_code } else: + UtilClient.read_as_string(_response.body) return { 'headers': _response.headers, 'statusCode': _response.status_code diff --git a/python2/setup.py b/python2/setup.py index 8890ea2..e5232bf 100644 --- a/python2/setup.py +++ b/python2/setup.py @@ -25,7 +25,7 @@ """ setup module for alibabacloud_tea_openapi_py2. -Created on 06/02/2023 +Created on 10/11/2023 @author: Alibaba Cloud SDK """ @@ -38,7 +38,7 @@ URL = "https://github.com/aliyun/darabonba-openapi" VERSION = __import__(PACKAGE).__version__ REQUIRES = [ - "alibabacloud_tea_util_py2>=0.0.7, <1.0.0", + "alibabacloud_tea_util_py2>=0.0.8, <1.0.0", "alibabacloud_credentials_py2>=0.1.1, <1.0.0", "alibabacloud_openapi_util_py2>=0.1.1, <1.0.0", "alibabacloud_gateway_spi_py2>=0.0.1, <1.0.0", diff --git a/python2/tests/__init__.py b/python2/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/python2/tests/test_client.py b/python2/tests/test_client.py new file mode 100644 index 0000000..7d7766a --- /dev/null +++ b/python2/tests/test_client.py @@ -0,0 +1,684 @@ +# -*- coding: utf-8 -*- +import unittest +import re +import httpretty +from Tea.exceptions import TeaException +from httpretty.core import HTTPrettyRequest + +from alibabacloud_tea_openapi import models as open_api_models +from alibabacloud_credentials import models as credential_models +from alibabacloud_credentials.client import Client as CredentialClient +from alibabacloud_tea_openapi.client import Client as OpenApiClient +from alibabacloud_tea_util import models as util_models +from alibabacloud_openapi_util.client import Client as OpenApiUtilClient + + +class TestClient(unittest.TestCase): + + def test_config(self): + global_parameters = open_api_models.GlobalParameters( + headers={ + 'global-key': 'global-value' + }, + queries={ + 'global-query': 'global-value' + } + ) + config = open_api_models.Config( + endpoint='config.endpoint', + endpoint_type='regional', + network='config.network', + suffix='config.suffix', + protocol='config.protocol', + method='config.method', + region_id='config.regionId', + user_agent='config.userAgent', + read_timeout=3000, + connect_timeout=3000, + http_proxy='config.httpProxy', + https_proxy='config.httpsProxy', + no_proxy='config.noProxy', + socks_5proxy='config.socks5Proxy', + socks_5net_work='config.socks5NetWork', + max_idle_conns=128, + signature_version='config.signatureVersion', + signature_algorithm='config.signatureAlgorithm', + global_parameters=global_parameters + ) + cre_config = credential_models.Config( + access_key_id='accessKeyId', + access_key_secret='accessKeySecret', + security_token='securityToken', + type='sts' + ) + credential = CredentialClient(cre_config) + config.credential = credential + client = OpenApiClient(config) + self.assertEqual('accessKeyId', client.get_access_key_id()) + self.assertEqual('accessKeySecret', client.get_access_key_secret()) + self.assertEqual('securityToken', client.get_security_token()) + self.assertEqual('sts', client.get_type()) + config.access_key_id = 'ak' + config.access_key_secret = 'secret' + config.security_token = 'token' + config.type = 'sts' + client = OpenApiClient(config) + self.assertEqual('ak', client.get_access_key_id()) + self.assertEqual('secret', client.get_access_key_secret()) + self.assertEqual('token', client.get_security_token()) + self.assertEqual('sts', client.get_type()) + self.assertIsNone(client._spi) + self.assertIsNone(client._endpoint_rule) + self.assertIsNone(client._endpoint_map) + self.assertIsNone(client._product_id) + self.assertEqual("config.endpoint", client._endpoint) + self.assertEqual("regional", client._endpoint_type) + self.assertEqual("config.network", client._network) + self.assertEqual("config.suffix", client._suffix) + self.assertEqual("config.protocol", client._protocol) + self.assertEqual("config.method", client._method) + self.assertEqual("config.regionId", client._region_id) + self.assertEqual("config.userAgent", client._user_agent) + self.assertEqual(3000, client._read_timeout) + self.assertEqual(3000, client._connect_timeout) + self.assertEqual("config.httpProxy", client._http_proxy) + self.assertEqual("config.httpsProxy", client._https_proxy) + self.assertEqual("config.noProxy", client._no_proxy) + self.assertEqual("config.socks5Proxy", client._socks_5proxy) + self.assertEqual("config.socks5NetWork", client._socks_5net_work) + self.assertEqual(128, client._max_idle_conns) + self.assertEqual("config.signatureVersion", client._signature_version) + self.assertEqual("config.signatureAlgorithm", client._signature_algorithm) + self.assertEqual("global-value", client._global_parameters.headers.get("global-key")) + self.assertEqual("global-value", client._global_parameters.queries.get("global-query")) + + def create_config(self): + global_parameters = open_api_models.GlobalParameters( + headers={ + 'global-key': 'global-value' + }, + queries={ + 'global-query': 'global-value' + } + ) + config = open_api_models.Config( + access_key_id='ak', + access_key_secret='secret', + security_token='token', + type='sts', + user_agent='config.userAgent', + read_timeout=3000, + connect_timeout=3000, + max_idle_conns=128, + signature_version='config.signatureVersion', + signature_algorithm='ACS3-HMAC-SHA256', + global_parameters=global_parameters + ) + return config + + def create_runtime_options(self): + runtime = util_models.RuntimeOptions( + read_timeout=4000, + connect_timeout=4000, + max_idle_conns=100, + autoretry=True, + max_attempts=1, + backoff_policy='no', + backoff_period=1, + ignore_ssl=True + ) + return runtime + + def create_open_api_request(self): + query = {} + query['key1'] = 'value' + query['key2'] = 1 + query['key3'] = True + body = {} + body['key1'] = 'value' + body['key2'] = 1 + body['key3'] = True + headers = { + 'for-test': 'sdk' + } + req = open_api_models.OpenApiRequest( + headers=headers, + query=OpenApiUtilClient.query(query), + body=OpenApiUtilClient.parse_to_map(body) + ) + return req + + @httpretty.activate(allow_net_connect=False) + def test_call_api_for_rpcwith_v2sign_ak_form(self): + requestBody = 'key1=value&key2=1&key3=True' + responseBody = '{"AppId":"test", "ClassId":"test", "UserId":123}' + config = self.create_config() + runtime = self.create_runtime_options() + config.protocol = 'HTTP' + config.signature_algorithm = 'v2' + config.endpoint = 'test.aliyuncs.com' + client = OpenApiClient(config) + request = self.create_open_api_request() + params = open_api_models.Params( + action='TestAPI', + version='2022-06-01', + protocol='HTTPS', + pathname='/', + method='POST', + auth_type='AK', + style='RPC', + req_body_type='formData', + body_type='json' + ) + + def request_callback(request, uri, headers): + assert 'value' == request.querystring['key1'][0] + assert '1' == request.querystring['key2'][0] + assert 'True' == request.querystring['key3'][0] + assert 'TestAPI' == request.querystring['Action'][0] + assert '2022-06-01' == request.querystring['Version'][0] + assert 'ak' == request.querystring['AccessKeyId'][0] + assert 'token' == request.querystring['SecurityToken'][0] + assert '1.0' == request.querystring['SignatureVersion'][0] + assert 'HMAC-SHA1' == request.querystring['SignatureMethod'][0] + assert 'json' == request.querystring['Format'][0] + assert None is not request.querystring['Timestamp'][0] + assert None is not request.querystring['SignatureNonce'][0] + assert None is not request.querystring['Signature'][0] + assert 'test.aliyuncs.com' == request.headers.get('host') + assert '2022-06-01' == request.headers.get('x-acs-version') + assert 'TestAPI' == request.headers.get('x-acs-action') + assert None is not re.match('AlibabaCloud.+TeaDSL/1 config.userAgent', + request.headers.get('user-agent')) + content_type = request.headers.get('content-type') + assert request.body.decode('utf-8') == requestBody, 'unexpected body: {}'.format(request.body) + assert content_type == 'application/x-www-form-urlencoded', 'expected application/json but received Content-Type: {}'.format( + content_type) + headers['x-acs-request-id'] = 'A45EE076-334D-5012-9746-A8F828D20FD4' + return [200, headers, responseBody] + + httpretty.register_uri( + httpretty.POST, "http://test.aliyuncs.com", + body=request_callback) + result = client.call_api(params, request, runtime) + self.assertEqual('A45EE076-334D-5012-9746-A8F828D20FD4', result.get("headers").get("x-acs-request-id")) + self.assertEqual('test', result.get('body').get('AppId')) + self.assertEqual('test', result.get('body').get('ClassId')) + self.assertEqual(123, result.get('body').get('UserId')) + + @httpretty.activate(allow_net_connect=False) + def test_call_api_for_rpcwith_v2sign_anonymous_json(self): + requestBody = 'key1=value&key2=1&key3=True' + responseBody = '{"AppId":"test", "ClassId":"test", "UserId":123}' + config = self.create_config() + runtime = self.create_runtime_options() + config.protocol = 'HTTP' + config.signature_algorithm = 'v2' + config.endpoint = 'test.aliyuncs.com' + client = OpenApiClient(config) + request = self.create_open_api_request() + params = open_api_models.Params( + action='TestAPI', + version='2022-06-01', + protocol='HTTPS', + pathname='/', + method='POST', + auth_type='Anonymous', + style='RPC', + req_body_type='json', + body_type='json' + ) + + def request_callback(request, uri, headers): + assert 'value' == request.querystring['key1'][0] + assert '1' == request.querystring['key2'][0] + assert 'True' == request.querystring['key3'][0] + assert 'TestAPI' == request.querystring['Action'][0] + assert '2022-06-01' == request.querystring['Version'][0] + assert 'json' == request.querystring['Format'][0] + assert None is not request.querystring['Timestamp'][0] + assert None is not request.querystring['SignatureNonce'][0] + assert 'test.aliyuncs.com' == request.headers.get('host') + assert '2022-06-01' == request.headers.get('x-acs-version') + assert 'TestAPI' == request.headers.get('x-acs-action') + assert None is not re.match('AlibabaCloud.+TeaDSL/1 config.userAgent', + request.headers.get('user-agent')) + content_type = request.headers.get('content-type') + assert request.body.decode('utf-8') == requestBody, 'unexpected body: {}'.format(request.body) + assert content_type == 'application/x-www-form-urlencoded', 'expected application/json but received Content-Type: {}'.format( + content_type) + headers['x-acs-request-id'] = 'A45EE076-334D-5012-9746-A8F828D20FD4' + return [200, headers, responseBody] + + httpretty.register_uri( + httpretty.POST, "http://test.aliyuncs.com", + body=request_callback) + result = client.call_api(params, request, runtime) + self.assertEqual('A45EE076-334D-5012-9746-A8F828D20FD4', result.get("headers").get("x-acs-request-id")) + self.assertEqual('test', result.get('body').get('AppId')) + self.assertEqual('test', result.get('body').get('ClassId')) + self.assertEqual(123, result.get('body').get('UserId')) + + @httpretty.activate(allow_net_connect=False) + def test_call_api_for_roawith_v2sign_ak_form(self): + requestBody = 'key1=value&key2=1&key3=True' + responseBody = '{"AppId":"test", "ClassId":"test", "UserId":123}' + config = self.create_config() + runtime = self.create_runtime_options() + config.protocol = 'HTTP' + config.signature_algorithm = 'v2' + config.endpoint = 'test.aliyuncs.com' + client = OpenApiClient(config) + request = self.create_open_api_request() + params = open_api_models.Params( + action='TestAPI', + version='2022-06-01', + protocol='HTTPS', + pathname='/test', + method='POST', + auth_type='AK', + style='ROA', + req_body_type='formData', + body_type='json' + ) + + def request_callback(request, uri, headers): + assert 'value' == request.querystring['key1'][0] + assert '1' == request.querystring['key2'][0] + assert 'True' == request.querystring['key3'][0] + assert 'sdk' == request.headers.get('for-test') + assert 'test.aliyuncs.com' == request.headers.get('host') + assert '2022-06-01' == request.headers.get('x-acs-version') + assert 'TestAPI' == request.headers.get('x-acs-action') + assert 'application/json' == request.headers.get('accept') + assert 'HMAC-SHA1' == request.headers.get('x-acs-signature-method') + assert '1.0' == request.headers.get('x-acs-signature-version') + assert 'ak' == request.headers.get('x-acs-accesskey-id') + assert 'token' == request.headers.get('x-acs-security-token') + assert None is not request.headers.get('date') + assert None is not request.headers.get('x-acs-signature-nonce') + + assert None is not re.match('acs ak:.+', request.headers.get('authorization')) + assert None is not re.match('AlibabaCloud.+TeaDSL/1 config.userAgent', request.headers.get('user-agent')) + content_type = request.headers.get('content-type') + assert request.body.decode('utf-8') == requestBody, 'unexpected body: {}'.format(request.body) + assert content_type == 'application/x-www-form-urlencoded', 'expected application/json but received Content-Type: {}'.format( + content_type) + headers['x-acs-request-id'] = 'A45EE076-334D-5012-9746-A8F828D20FD4' + return [200, headers, responseBody] + + httpretty.register_uri( + httpretty.POST, "http://test.aliyuncs.com/test", + body=request_callback) + result = client.call_api(params, request, runtime) + self.assertEqual('A45EE076-334D-5012-9746-A8F828D20FD4', result.get("headers").get("x-acs-request-id")) + self.assertEqual('test', result.get('body').get('AppId')) + self.assertEqual('test', result.get('body').get('ClassId')) + self.assertEqual(123, result.get('body').get('UserId')) + + @httpretty.activate(allow_net_connect=False) + def test_call_api_for_roawith_v2sign_anonymous_json(self): + requestBody = '{"key1": "value", "key2": 1, "key3": true}' + responseBody = '{"AppId":"test", "ClassId":"test", "UserId":123}' + config = self.create_config() + runtime = self.create_runtime_options() + config.protocol = 'HTTP' + config.signature_algorithm = 'v2' + config.endpoint = 'test.aliyuncs.com' + client = OpenApiClient(config) + request = self.create_open_api_request() + params = open_api_models.Params( + action='TestAPI', + version='2022-06-01', + protocol='HTTPS', + pathname='/test', + method='POST', + auth_type='Anonymous', + style='ROA', + req_body_type='json', + body_type='json' + ) + + def request_callback(request, uri, headers): + assert 'value' == request.querystring['key1'][0] + assert '1' == request.querystring['key2'][0] + assert 'True' == request.querystring['key3'][0] + assert 'sdk' == request.headers.get('for-test') + assert 'test.aliyuncs.com' == request.headers.get('host') + assert '2022-06-01' == request.headers.get('x-acs-version') + assert 'TestAPI' == request.headers.get('x-acs-action') + assert 'application/json' == request.headers.get('accept') + assert 'HMAC-SHA1' == request.headers.get('x-acs-signature-method') + assert '1.0' == request.headers.get('x-acs-signature-version') + assert None is not request.headers.get('date') + assert None is not request.headers.get('x-acs-signature-nonce') + assert None is not re.match('AlibabaCloud.+TeaDSL/1 config.userAgent', request.headers.get('user-agent')) + content_type = request.headers.get('content-type') + assert request.body.decode('utf-8') == requestBody, 'unexpected body: {}'.format(request.body) + assert content_type == 'application/json; charset=utf-8', 'expected application/json but received Content-Type: {}'.format( + content_type) + headers['x-acs-request-id'] = 'A45EE076-334D-5012-9746-A8F828D20FD4' + return [200, headers, responseBody] + + httpretty.register_uri( + httpretty.POST, "http://test.aliyuncs.com/test", + body=request_callback) + result = client.call_api(params, request, runtime) + self.assertEqual('A45EE076-334D-5012-9746-A8F828D20FD4', result.get("headers").get("x-acs-request-id")) + self.assertEqual('test', result.get('body').get('AppId')) + self.assertEqual('test', result.get('body').get('ClassId')) + self.assertEqual(123, result.get('body').get('UserId')) + + @httpretty.activate(allow_net_connect=False) + def test_call_api_for_rpcwith_v3sign_ak_form(self): + requestBody = 'key1=value&key2=1&key3=True' + responseBody = '{"AppId":"test", "ClassId":"test", "UserId":123}' + config = self.create_config() + runtime = self.create_runtime_options() + config.protocol = 'HTTP' + config.endpoint = 'test.aliyuncs.com' + client = OpenApiClient(config) + request = self.create_open_api_request() + params = open_api_models.Params( + action='TestAPI', + version='2022-06-01', + protocol='HTTPS', + pathname='/', + method='POST', + auth_type='AK', + style='RPC', + req_body_type='formData', + body_type='json' + ) + + def request_callback(request, uri, headers): + assert 'value' == request.querystring['key1'][0] + assert '1' == request.querystring['key2'][0] + assert 'True' == request.querystring['key3'][0] + assert 'global-value' == request.querystring['global-query'][0] + assert 'sdk' == request.headers.get('for-test') + assert 'global-value' == request.headers.get('global-key') + assert 'test.aliyuncs.com' == request.headers.get('host') + assert '2022-06-01' == request.headers.get('x-acs-version') + assert 'TestAPI' == request.headers.get('x-acs-action') + assert 'application/json' == request.headers.get('accept') + assert 'ak' == request.headers.get('x-acs-accesskey-id') + assert 'token' == request.headers.get('x-acs-security-token') + assert None is not request.headers.get('x-acs-date') + assert None is not request.headers.get('x-acs-signature-nonce') + assert None is not request.headers.get('x-acs-content-sha256') + + assert None is not re.match( + 'ACS3-HMAC-SHA256 Credential=ak,SignedHeaders=accept;content-type;for-test;global-key;' + + 'host;user-agent;x-acs-accesskey-id;x-acs-action;x-acs-content-sha256;x-acs-date;x-acs-security-token;' + + 'x-acs-signature-nonce;x-acs-version,Signature=.+', request.headers.get('Authorization')) + assert None is not re.match('AlibabaCloud.+TeaDSL/1 config.userAgent', request.headers.get('user-agent')) + content_type = request.headers.get('content-type') + assert request.body.decode('utf-8') == requestBody, 'unexpected body: {}'.format(request.body) + assert content_type == 'application/x-www-form-urlencoded', 'expected application/json but received Content-Type: {}'.format( + content_type) + headers['x-acs-request-id'] = 'A45EE076-334D-5012-9746-A8F828D20FD4' + return [200, headers, responseBody] + + httpretty.register_uri( + httpretty.POST, "http://test.aliyuncs.com", + body=request_callback) + result = client.call_api(params, request, runtime) + self.assertEqual('A45EE076-334D-5012-9746-A8F828D20FD4', result.get("headers").get("x-acs-request-id")) + self.assertEqual('test', result.get('body').get('AppId')) + self.assertEqual('test', result.get('body').get('ClassId')) + self.assertEqual(123, result.get('body').get('UserId')) + + @httpretty.activate(allow_net_connect=False) + def test_call_api_for_rpcwith_v3sign_anonymous_json(self): + requestBody = '{"key1": "value", "key2": 1, "key3": true}' + responseBody = '{"AppId":"test", "ClassId":"test", "UserId":123}' + config = self.create_config() + runtime = self.create_runtime_options() + config.protocol = 'HTTP' + config.endpoint = 'test.aliyuncs.com' + client = OpenApiClient(config) + request = self.create_open_api_request() + params = open_api_models.Params( + action='TestAPI', + version='2022-06-01', + protocol='HTTPS', + pathname='/', + method='POST', + auth_type='Anonymous', + style='RPC', + req_body_type='json', + body_type='json' + ) + + def request_callback(request, uri, headers): + assert 'value' == request.querystring['key1'][0] + assert '1' == request.querystring['key2'][0] + assert 'True' == request.querystring['key3'][0] + assert 'global-value' == request.querystring['global-query'][0] + assert 'sdk' == request.headers.get('for-test') + assert 'global-value' == request.headers.get('global-key') + assert 'test.aliyuncs.com' == request.headers.get('host') + assert '2022-06-01' == request.headers.get('x-acs-version') + assert 'TestAPI' == request.headers.get('x-acs-action') + assert 'application/json' == request.headers.get('accept') + assert None is not request.headers.get('x-acs-date') + assert None is not request.headers.get('x-acs-signature-nonce') + assert None is not request.headers.get('x-acs-content-sha256') + + assert None is not re.match('AlibabaCloud.+TeaDSL/1 config.userAgent', request.headers.get('user-agent')) + content_type = request.headers.get('content-type') + assert request.body.decode('utf-8') == requestBody, 'unexpected body: {}'.format(request.body) + assert content_type == 'application/json; charset=utf-8', 'expected application/json but received Content-Type: {}'.format( + content_type) + headers['x-acs-request-id'] = 'A45EE076-334D-5012-9746-A8F828D20FD4' + return [200, headers, responseBody] + + httpretty.register_uri( + httpretty.POST, "http://test.aliyuncs.com", + body=request_callback) + result = client.call_api(params, request, runtime) + self.assertEqual('A45EE076-334D-5012-9746-A8F828D20FD4', result.get("headers").get("x-acs-request-id")) + self.assertEqual('test', result.get('body').get('AppId')) + self.assertEqual('test', result.get('body').get('ClassId')) + self.assertEqual(123, result.get('body').get('UserId')) + + @httpretty.activate(allow_net_connect=False) + def test_call_api_for_roawith_v3sign_ak_form(self): + requestBody = 'key1=value&key2=1&key3=True' + responseBody = '{"AppId":"test", "ClassId":"test", "UserId":123}' + config = self.create_config() + runtime = self.create_runtime_options() + config.protocol = 'HTTP' + config.endpoint = 'test.aliyuncs.com' + client = OpenApiClient(config) + request = self.create_open_api_request() + params = open_api_models.Params( + action='TestAPI', + version='2022-06-01', + protocol='HTTPS', + pathname='/test', + method='POST', + auth_type='AK', + style='ROA', + req_body_type='formData', + body_type='json' + ) + + def request_callback(request, uri, headers): + assert 'value' == request.querystring['key1'][0] + assert '1' == request.querystring['key2'][0] + assert 'True' == request.querystring['key3'][0] + assert 'global-value' == request.querystring['global-query'][0] + assert 'sdk' == request.headers.get('for-test') + assert 'global-value' == request.headers.get('global-key') + assert 'test.aliyuncs.com' == request.headers.get('host') + assert '2022-06-01' == request.headers.get('x-acs-version') + assert 'TestAPI' == request.headers.get('x-acs-action') + assert 'application/json' == request.headers.get('accept') + assert 'ak' == request.headers.get('x-acs-accesskey-id') + assert 'token' == request.headers.get('x-acs-security-token') + assert None is not request.headers.get('x-acs-date') + assert None is not request.headers.get('x-acs-signature-nonce') + assert None is not request.headers.get('x-acs-content-sha256') + + assert None is not re.match( + 'ACS3-HMAC-SHA256 Credential=ak,SignedHeaders=accept;content-type;for-test;global-key;' + + 'host;user-agent;x-acs-accesskey-id;x-acs-action;x-acs-content-sha256;x-acs-date;x-acs-security-token;' + + 'x-acs-signature-nonce;x-acs-version,Signature=.+', request.headers.get('Authorization')) + assert None is not re.match('AlibabaCloud.+TeaDSL/1 config.userAgent', request.headers.get('user-agent')) + content_type = request.headers.get('content-type') + assert request.body.decode('utf-8') == requestBody, 'unexpected body: {}'.format(request.body) + assert content_type == 'application/x-www-form-urlencoded', 'expected application/json but received Content-Type: {}'.format( + content_type) + headers['x-acs-request-id'] = 'A45EE076-334D-5012-9746-A8F828D20FD4' + return [200, headers, responseBody] + + httpretty.register_uri( + httpretty.POST, "http://test.aliyuncs.com/test", + body=request_callback) + result = client.call_api(params, request, runtime) + self.assertEqual('A45EE076-334D-5012-9746-A8F828D20FD4', result.get("headers").get("x-acs-request-id")) + self.assertEqual('test', result.get('body').get('AppId')) + self.assertEqual('test', result.get('body').get('ClassId')) + self.assertEqual(123, result.get('body').get('UserId')) + + @httpretty.activate(allow_net_connect=False) + def test_call_api_for_roawith_v3sign_anonymous_json(self): + requestBody = '{"key1": "value", "key2": 1, "key3": true}' + responseBody = '{"AppId":"test", "ClassId":"test", "UserId":123}' + config = self.create_config() + runtime = self.create_runtime_options() + config.protocol = 'HTTP' + config.endpoint = 'test.aliyuncs.com' + client = OpenApiClient(config) + request = self.create_open_api_request() + params = open_api_models.Params( + action='TestAPI', + version='2022-06-01', + protocol='HTTPS', + pathname='/test', + method='POST', + auth_type='Anonymous', + style='ROA', + req_body_type='json', + body_type='json' + ) + + def request_callback(request, uri, headers): + assert 'value' == request.querystring['key1'][0] + assert '1' == request.querystring['key2'][0] + assert 'True' == request.querystring['key3'][0] + assert 'global-value' == request.querystring['global-query'][0] + assert 'sdk' == request.headers.get('for-test') + assert 'global-value' == request.headers.get('global-key') + assert 'test.aliyuncs.com' == request.headers.get('host') + assert '2022-06-01' == request.headers.get('x-acs-version') + assert 'TestAPI' == request.headers.get('x-acs-action') + assert 'application/json' == request.headers.get('accept') + assert None is not request.headers.get('x-acs-date') + assert None is not request.headers.get('x-acs-signature-nonce') + assert None is not request.headers.get('x-acs-content-sha256') + + assert None is not re.match('AlibabaCloud.+TeaDSL/1 config.userAgent', request.headers.get('user-agent')) + content_type = request.headers.get('content-type') + assert request.body.decode('utf-8') == requestBody, 'unexpected body: {}'.format(request.body) + assert content_type == 'application/json; charset=utf-8', 'expected application/json but received Content-Type: {}'.format( + content_type) + headers['x-acs-request-id'] = 'A45EE076-334D-5012-9746-A8F828D20FD4' + return [200, headers, responseBody] + + httpretty.register_uri( + httpretty.POST, "http://test.aliyuncs.com/test", + body=request_callback) + result = client.call_api(params, request, runtime) + self.assertEqual('A45EE076-334D-5012-9746-A8F828D20FD4', result.get("headers").get("x-acs-request-id")) + self.assertEqual('test', result.get('body').get('AppId')) + self.assertEqual('test', result.get('body').get('ClassId')) + self.assertEqual(123, result.get('body').get('UserId')) + + @httpretty.activate(allow_net_connect=False) + def test_response_body_type(self): + requestBody = 'key1=value&key2=1&key3=True' + config = self.create_config() + runtime = self.create_runtime_options() + config.protocol = 'HTTP' + config.endpoint = 'test.aliyuncs.com' + client = OpenApiClient(config) + request = self.create_open_api_request() + request.headers['type'] = 'json' + params = open_api_models.Params( + action='TestAPI', + version='2022-06-01', + protocol='HTTPS', + pathname='/test', + method='POST', + auth_type='AK', + style='ROA', + req_body_type='formData', + body_type='json' + ) + + def request_callback(request, uri, headers): + assert 'value' == request.querystring['key1'][0] + assert '1' == request.querystring['key2'][0] + assert 'True' == request.querystring['key3'][0] + assert 'global-value' == request.querystring['global-query'][0] + assert 'sdk' == request.headers.get('for-test') + assert 'global-value' == request.headers.get('global-key') + assert 'test.aliyuncs.com' == request.headers.get('host') + assert '2022-06-01' == request.headers.get('x-acs-version') + assert 'TestAPI' == request.headers.get('x-acs-action') + assert 'application/json' == request.headers.get('accept') + assert 'ak' == request.headers.get('x-acs-accesskey-id') + assert 'token' == request.headers.get('x-acs-security-token') + assert None is not request.headers.get('x-acs-date') + assert None is not request.headers.get('x-acs-signature-nonce') + assert None is not request.headers.get('x-acs-content-sha256') + + assert None is not re.match('AlibabaCloud.+TeaDSL/1 config.userAgent', request.headers.get('user-agent')) + content_type = request.headers.get('content-type') + assert request.body.decode('utf-8') == requestBody, 'unexpected body: {}'.format(request.body) + assert content_type == 'application/x-www-form-urlencoded', 'expected application/json but received Content-Type: {}'.format( + content_type) + headers['x-acs-request-id'] = 'A45EE076-334D-5012-9746-A8F828D20FD4' + if request.headers.get('type') == 'array': + return [200, headers, '["AppId", "ClassId", "UserId"]'] + elif request.headers.get('type') == 'error': + return [400, headers, '{"Code":"error code", "Message":"error message", ' + '"RequestId":"A45EE076-334D-5012-9746-A8F828D20FD4"}'] + return [200, headers, '{"AppId":"test", "ClassId":"test", "UserId":123}'] + + httpretty.register_uri( + httpretty.POST, "http://test.aliyuncs.com/test", + body=request_callback) + result = client.call_api(params, request, runtime) + self.assertEqual('A45EE076-334D-5012-9746-A8F828D20FD4', result.get("headers").get("x-acs-request-id")) + self.assertEqual('test', result.get('body').get('AppId')) + self.assertEqual('test', result.get('body').get('ClassId')) + self.assertEqual(123, result.get('body').get('UserId')) + + params.body_type = 'array' + request.headers.update({'type': 'array'}) + result = client.call_api(params, request, runtime) + self.assertEqual('A45EE076-334D-5012-9746-A8F828D20FD4', result.get("headers").get("x-acs-request-id")) + self.assertEqual('AppId', result.get('body')[0]) + self.assertEqual('ClassId', result.get('body')[1]) + self.assertEqual('UserId', result.get('body')[2]) + + params.body_type = 'string' + result = client.call_api(params, request, runtime) + self.assertEqual('A45EE076-334D-5012-9746-A8F828D20FD4', result.get("headers").get("x-acs-request-id")) + self.assertEqual('["AppId", "ClassId", "UserId"]', result.get('body')) + + params.body_type = 'byte' + result = client.call_api(params, request, runtime) + self.assertEqual('A45EE076-334D-5012-9746-A8F828D20FD4', result.get("headers").get("x-acs-request-id")) + self.assertEqual('["AppId", "ClassId", "UserId"]', result.get('body').decode('utf-8')) + + request.headers.update({'type': 'error'}) + try: + client.call_api(params, request, runtime) + except TeaException as e: + self.assertEqual('code: 400, error message request id: A45EE076-334D-5012-9746-A8F828D20FD4', e.message) + self.assertEqual('error code', e.code) diff --git a/ts/package.json b/ts/package.json index c3fc32c..e65ad9b 100644 --- a/ts/package.json +++ b/ts/package.json @@ -24,7 +24,7 @@ }, "dependencies": { "@alicloud/tea-typescript": "^1.7.1", - "@alicloud/tea-util": "^1.4.5", + "@alicloud/tea-util": "^1.4.7", "@alicloud/credentials": "^2", "@alicloud/openapi-util": "^0.3.1", "@alicloud/gateway-spi": "^0.0.8", diff --git a/ts/src/client.ts b/ts/src/client.ts index 132f4db..15a58e6 100644 --- a/ts/src/client.ts +++ b/ts/src/client.ts @@ -1070,6 +1070,7 @@ export default class Client { statusCode: response_.statusCode, }; } else { + await Util.readAsString(response_.body); return { headers: response_.headers, statusCode: response_.statusCode,