Update 1.3.0.md

This commit is contained in:
Leonid Stryzhevskyi 2021-11-15 04:47:16 +02:00 committed by GitHub
parent b489ed073c
commit 97d7597112
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -9,6 +9,9 @@ Contents:
- [The New oatpp::String](#the-new-oatppstring) - [The New oatpp::String](#the-new-oatppstring)
- [ConnectionPool::get() Timeout](#connectionpoolget-timeout) - [ConnectionPool::get() Timeout](#connectionpoolget-timeout)
- [JSON Serializer Escape Flags](#json-serializer-escape-flags) - [JSON Serializer Escape Flags](#json-serializer-escape-flags)
- [Headers Stored In unordered_multimap](#headers-stored-in-unordered_multimap)
- [QueryParameters Stored In unordered_multimap](#queryparameters-stored-in-unordered_multimap)
- [Polymorphic DTO_FIELD](#polymorphic-dto_field)
- [ConnectionMonitor](#connectionmonitor) - [ConnectionMonitor](#connectionmonitor)
- [Request Data Bundle](#request-data-bundle) - [Request Data Bundle](#request-data-bundle)
- [ConnectionProviderSwitch](#connectionproviderswitch) - [ConnectionProviderSwitch](#connectionproviderswitch)
@ -146,6 +149,137 @@ Output:
res='"https://oatpp.io/"' # solidus isn't escaped res='"https://oatpp.io/"' # solidus isn't escaped
``` ```
## Headers Stored In unordered_multimap
Headers are now stored using [std::unordered_multimap](https://en.cppreference.com/w/cpp/container/unordered_multimap).
Put multiple headers:
```cpp
auto response = createResponse(Status::CODE_200, "");
response->putHeader("Set-Cookie", "...");
response->putHeader("Set-Cookie", "...");
return response;
```
Log all "Set-Cookie" headers:
```cpp
const auto& map = headers.getAll();
auto bucket = map.bucket("Set-Cookie");
auto bucketBegin = map.begin(bucket);
auto bucketEnd = map.end(bucket);
for(auto it = bucketBegin; it != bucketEnd; it ++) {
oatpp::String value = it->second.toString();
OATPP_LOGD("Header", "Set-Cookie: %s", value->c_str());
}
```
## QueryParameters Stored In unordered_multimap
QueryParameters are now stored using [std::unordered_multimap](https://en.cppreference.com/w/cpp/container/unordered_multimap).
Log all entries of "userId" query parameter:
```cpp
const auto& map = request->getQueryParameters().getAll();
auto bucket = map.bucket("userId");
auto bucketBegin = map.begin(bucket);
auto bucketEnd = map.end(bucket);
for(auto it = bucketBegin; it != bucketEnd; it ++) {
oatpp::String value = it->second.toString();
OATPP_LOGD("QueryParameter", "userId: %s", value->c_str());
}
```
## Polymorphic DTO_FIELD
Now, when used inside of a DTO, we can specify exact types that `oatpp::Any` can store by specifying `DTO_FIELD_TYPE_SELECTOR`:
```cpp
/* Possible type of a DTO_FIELD */
class ClassA : public oatpp::DTO {
DTO_INIT(ClassA, DTO)
DTO_FIELD(String, value);
};
/* Possible type of a DTO_FIELD */
class ClassB : public oatpp::DTO {
DTO_INIT(ClassB, DTO)
DTO_FIELD(Vector<String>, values);
};
/* enum of possible DTO_FIELD types */
ENUM(ClassType, v_int32,
VALUE(CLASS_TYPE_A, 0),
VALUE(CLASS_TYPE_B, 1)
)
/* our DTO */
class ResponseDto : public oatpp::DTO {
DTO_INIT(ResponseDto, DTO)
/* type control field */
DTO_FIELD(Enum<ClassType>::AsString, payloadType);
/* polymorphic field */
DTO_FIELD(Any, payload);
/* type selector */
DTO_FIELD_TYPE_SELECTOR(payload) {
if(!payloadType) return Void::Class::getType();
switch (*payloadType) {
case ClassType::CLASS_TYPE_A: return Object<ClassA>::Class::getType();
case ClassType::CLASS_TYPE_B: return Object<ClassB>::Class::getType();
}
}
};
...
/* send polymorphic payload to client */
ENDPOINT("GET", "payload", getPayload) {
auto payload = ClassB::createShared();
payload->values = {"value1", "value2", "value3"};
auto r = ResponseDto::createShared();
r->payloadType = ClassType::CLASS_TYPE_B;
r->payload = payload;
return createDtoResponse(Status::CODE_200, r);
}
/* receive polymorphic payload from client */
ENDPOINT("POST", "payload", postPayload,
BODY_DTO(oatpp::Object<ResponseDto>, r))
{
/* check type-control field and retrieve value of the corresponding type */
if(r->payloadType == ClassType::CLASS_TYPE_B) {
auto payload = r->payload.retrieve<oatpp::Object<ClassB>>();
for(auto& value : *payload->values) {
OATPP_LOGD("VALUE", "%s", value->c_str());
}
}
return createResponse(Status::CODE_200, "OK");
}
```
## ConnectionMonitor ## ConnectionMonitor
`oatpp::network::monitor::ConnectionMonitor` is a middleman who's able to monitor provided connections and close those ones that not satisfy selected rules. `oatpp::network::monitor::ConnectionMonitor` is a middleman who's able to monitor provided connections and close those ones that not satisfy selected rules.