From 38dab66f9d2e8afdee1b053579e6a09e39df7cd4 Mon Sep 17 00:00:00 2001 From: wb-hx510875 Date: Sun, 19 Jan 2020 14:45:57 +0800 Subject: [PATCH] supported body parameter. --- .../alibabacloud/core/ServiceRequest.h | 3 + core/src/RpcServiceClient.cc | 83 +++++++++++++------ core/src/ServiceRequest.cc | 13 ++- 3 files changed, 71 insertions(+), 28 deletions(-) diff --git a/core/include/alibabacloud/core/ServiceRequest.h b/core/include/alibabacloud/core/ServiceRequest.h index b719a6fb7..71e888ded 100644 --- a/core/include/alibabacloud/core/ServiceRequest.h +++ b/core/include/alibabacloud/core/ServiceRequest.h @@ -36,6 +36,7 @@ public: size_t contentSize() const; bool hasContent() const; ParameterCollection parameters() const; + ParameterCollection bodyParameters() const; std::string product() const; std::string resourcePath() const; std::string version() const; @@ -50,6 +51,7 @@ public: ParameterValueType getHeader(const ParameterNameType &name); void removeHeader(const ParameterNameType &name); ParameterCollection headers() const; + void setBodyParameter(const ParameterNameType &name, const ParameterValueType &value); protected: ServiceRequest(const std::string &product, const std::string &version); @@ -81,6 +83,7 @@ private: char *content_; size_t contentSize_; ParameterCollection params_; + ParameterCollection body_params_; ParameterCollection headers_; std::string product_; std::string resourcePath_; diff --git a/core/src/RpcServiceClient.cc b/core/src/RpcServiceClient.cc index c3259b4f5..1bfa35e28 100644 --- a/core/src/RpcServiceClient.cc +++ b/core/src/RpcServiceClient.cc @@ -63,28 +63,33 @@ HttpRequest RpcServiceClient::buildHttpRequest(const std::string & endpoint, const Credentials credentials = credentialsProvider_->getCredentials(); Url url; - if (msg.scheme().empty()) { + if (msg.scheme().empty()) + { url.setScheme("https"); - } else { + } + else + { url.setScheme(msg.scheme()); } url.setHost(endpoint); url.setPath(msg.resourcePath()); + std::map signParams; + auto params = msg.parameters(); - std::map queryParams; - for (const auto &p : params) { + for (const auto &p : params) + { if (!p.second.empty()) - queryParams[p.first] = p.second; + signParams[p.first] = p.second; } - queryParams["AccessKeyId"] = credentials.accessKeyId(); - queryParams["Format"] = "JSON"; - queryParams["RegionId"] = configuration().regionId(); - queryParams["SecurityToken"] = credentials.sessionToken(); - queryParams["SignatureMethod"] = signer_->name(); - queryParams["SignatureNonce"] = GenerateUuid(); - queryParams["SignatureVersion"] = signer_->version(); + signParams["AccessKeyId"] = credentials.accessKeyId(); + signParams["Format"] = "JSON"; + signParams["RegionId"] = configuration().regionId(); + signParams["SecurityToken"] = credentials.sessionToken(); + signParams["SignatureMethod"] = signer_->name(); + signParams["SignatureNonce"] = GenerateUuid(); + signParams["SignatureVersion"] = signer_->version(); std::time_t t = std::time(nullptr); std::stringstream ss; #if defined(__GNUG__) && __GNUC__ < 5 @@ -94,28 +99,42 @@ HttpRequest RpcServiceClient::buildHttpRequest(const std::string & endpoint, #else ss << std::put_time(std::gmtime(&t), "%FT%TZ"); #endif - queryParams["Timestamp"] = ss.str(); - queryParams["Version"] = msg.version(); + signParams["Timestamp"] = ss.str(); + signParams["Version"] = msg.version(); + + std::map query; + for (const auto &p : signParams) + { + query[p.first] = p.second; + } + + auto body_params = msg.bodyParameters(); + for (const auto &p : body_params) + { + signParams[p.first] = p.second; + } std::stringstream plaintext; plaintext << HttpMethodToString(method) - << "&" - << UrlEncode(url.path()) - << "&" - << UrlEncode(canonicalizedQuery(queryParams)); - - queryParams["Signature"] = signer_->generate(plaintext.str(), - credentials.accessKeySecret() + "&"); + << "&" + << UrlEncode(url.path()) + << "&" + << UrlEncode(canonicalizedQuery(signParams)); + query["Signature"] = signer_->generate(plaintext.str(), + credentials.accessKeySecret() + "&"); std::stringstream queryString; - for (const auto &p : queryParams) + for (const auto &p : query) queryString << "&" << p.first << "=" << UrlEncode(p.second); url.setQuery(queryString.str().substr(1)); HttpRequest request(url); - if (msg.connectTimeout() != kInvalidTimeout) { + if (msg.connectTimeout() != kInvalidTimeout) + { request.setConnectTimeout(msg.connectTimeout()); - } else { + } + else + { request.setConnectTimeout(configuration().connectTimeout()); } @@ -127,16 +146,26 @@ HttpRequest RpcServiceClient::buildHttpRequest(const std::string & endpoint, } } - if (msg.readTimeout() != kInvalidTimeout) { + if (msg.readTimeout() != kInvalidTimeout) + { request.setReadTimeout(msg.readTimeout()); - } else { + } + else + { request.setReadTimeout(configuration().readTimeout()); } request.setMethod(method); request.setHeader("Host", url.host()); request.setHeader("x-sdk-client", - std::string("CPP/").append(ALIBABACLOUD_VERSION_STR)); + std::string("CPP/").append(ALIBABACLOUD_VERSION_STR)); + std::stringstream tmp; + for (const auto &p : body_params) + tmp << "&" << p.first << "=" << UrlEncode(p.second); + if(tmp.str().length() > 0){ + std::string body = tmp.str().substr(1); + request.setBody(body.c_str(), body.length()); + } return request; } diff --git a/core/src/ServiceRequest.cc b/core/src/ServiceRequest.cc index 14db49ac7..2d2eb5104 100644 --- a/core/src/ServiceRequest.cc +++ b/core/src/ServiceRequest.cc @@ -137,6 +137,12 @@ ServiceRequest::ParameterCollection ServiceRequest::parameters() const return params_; } + +ServiceRequest::ParameterCollection ServiceRequest::bodyParameters() const +{ + return body_params_; +} + void ServiceRequest::removeParameter(const ParameterNameType &name) { params_.erase(name); @@ -153,6 +159,11 @@ void ServiceRequest::setCoreParameter(const ParameterNameType &name, const Param setParameter(name, value); } +void ServiceRequest::setBodyParameter(const ParameterNameType &name, const ParameterValueType &value) +{ + body_params_[name] = value; +} + void ServiceRequest::setParameters(const ParameterCollection ¶ms) { params_ = params; @@ -162,7 +173,7 @@ void ServiceRequest::setJsonParameters(const ParameterNameType &name, const Para { params_ = params; params_ = params; - setCoreParameter(name, AlibabaCloud::MapToJson(params)); + setParameter(name, AlibabaCloud::MapToJson(params)); } std::string ServiceRequest::version() const